如何从HttpResponseMessage反序列化protobuf内容

问题描述 投票:1回答:1

我正在尝试以protobuf格式从我的数据库反序列化响应消息。它有这个架构:

syntax = "proto3";

message Person {
  uint64 id = 1;
  string name = 2;
  string surname = 3;
  uint32 age = 4;
};

我创建了这个类来反序列化它:

[ProtoContract]
public class Person
{
    [ProtoMember(1)]
    public long Id { get; set; }
    [ProtoMember(2)]
    public string Name { get; set; }
    [ProtoMember(3)]
    public string Surname { get; set; }
    [ProtoMember(4)]
    public int Age { get; set; }
}

接下来,我试着这样做:

var response = await client.PostAsync("", new StringContent(request));
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
    var person = Serializer.Deserialize<Person>(responseStream);
}

但是我给了一个ProtoBuf.ProtoException: Invalid wire-type;

然后我决定看看字节数组:

{25, 8, 1, 18, 6, 82, 111, 98, 101, 114, 116, 26, 11, 79, 112, 112, 101, 110, 104, 101, 105, 109, 101, 114, 32, 38 }

我手工创建了一个条目,必须由我的数据库返回,并将其序列化:

{8, 1, 18, 6, 82, 111, 98, 101, 114, 116, 26, 11, 79, 112, 112, 101, 110, 104, 101, 105, 109, 101, 114, 32, 38 }

如你所见,它们几乎相同,但我的数据库在开始时发送25

你能帮我一下,可能是什么错误?谢谢!

c# protobuf-net
1个回答
0
投票

我意识到,这是由于streaming multiple messages。在这种情况下,我已经将我的方法重写为:

List<Person> persons;
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
    persons = Serializer.DeserializeItems<Person>(responseStream, PrefixStyle.Base128, 0).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.