Как десериализовать объекты, указанные в веб-сервисе .asmx, используя protobuf-net - PullRequest
2 голосов
/ 07 февраля 2012

Как указать атрибуты ProtoBuf-Net в классах веб-ссылки?

У меня есть веб-служба .net 2.0, в которой я создаю байт [] с использованием protobuf.В моем клиенте (v3.5) я хочу десериализовать байт [] в соответствующий класс.Однако при десериализации все, что я получаю, это 0 и нули.

Причина этого в том, что я указываю тип в качестве класса Web Reference.

не работает правильно

using (MemoryStream stream = new MemoryStream(byteArray))
{
            List<WebReferencePerson> personsList =  Serializer.DeserializeWithLengthPrefix<List<WebReferencePerson>>(stream, PrefixStyle.Base128);
            stream.Close();
}

Однако, если я создаю другой класс Person1 в клиенте и указываю атрибуты Proto [ProtoContract] и [ProtoMember ()], я получаю правильные данныедесериализации.то есть

[ProtoContract]
class Person1
{
    [ProtoMember(1)]
    string Name {get;set;}
    [ProtoMember(2)]
    int Id {get;set;}
}

Это прекрасно работает.

List<Person1> personsList = 
Serializer.DeserializeWithLengthPrefix<List<Person1>>(stream, PrefixStyle.Base128);

Нет ли способа использовать классы из веб-справочника для десериализации данных?Как я могу указать атрибуты Protobuf для класса Web Reference?ИЛИ Нужно ли указывать другой класс с атрибутами Proto для десериализации данных из WebService?

1 Ответ

0 голосов
/ 07 февраля 2012

Сгенерированные asmx типы не будут иметь маркеров маркеров;Есть несколько способов обойти это:

  • десериализовать в protobuf DTO
  • использовать частичный класс, чтобы сообщить ему о макете
  • определить макетв коде

Второй вариант будет выглядеть так:

namespace Your.Namespace {
    [ProtoContract]
    [ProtoPartialMember(1, "Name")]
    [ProtoPartialMember(2,  "Id")]
    partial class WebReferencePerson {}
}

Третий вариант будет, как часть запуска приложения:

RuntimeTypeModel.Default.Add(typeof(WebReferencePerson), false)
                    .Add("Name", "Id");

Сзатем любой из этих подходов следует десериализовать.

...