Как десериализовать содержимое protobuf из HttpResponseMessage - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь десериализовать ответное сообщение из моей базы данных в формате 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 в начале.

Не могли бы вы мне помочь, в чем может быть ошибка?Спасибо!

1 Ответ

0 голосов
/ 26 марта 2019

Я понял, что это из-за streaming multiple messages. И в этом случае я переписал свой метод:

List<Person> persons;
using (var responseStream = await response.Content.ReadAsStreamAsync())
{
    persons = Serializer.DeserializeItems<Person>(responseStream, PrefixStyle.Base128, 0).ToList();
}
...