如何使用protobuf-net反序列化.asmx webservice中指定的对象

时间:2012-02-07 15:04:24

标签: protobuf-net

如何在WebReference的类中指定ProtoBuf-Net属性?

我有一个.net 2.0 Web服务,我在其中使用protobuf创建一个byte []。 在我的客户端(v3.5)中,我想将byte []反序列化到相应的类中。 但是,当我反序列化时,我得到的是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);

是否有办法使用Web Reference中的类来反序列化数据? 如何为Web Reference类指定Protobuf属性? 要么 我是否必须使用Proto属性指定另一个类来反序列化来自WebService的数据?

1 个答案:

答案 0 :(得分:0)

asmx生成的类型不会有标记标记标记;有很多方法可以解决这个问题:

  • 反序列化为protobuf DTO
  • 使用部分类来告诉它布局
  • 在代码中定义布局

第二个选项如下:

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

第三个选项是app-start的一部分:

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

使用这些方法中的任何一种,都应该反序列化。