2012-07-13 75 views
1

我试图使用protobuf-net并面临以下问题。 我有两个班。 protobuf-net和子类中的空属性

[ProtoContract] 
class parent 
{ 
    [ProtoMember(1)] 
    public string name { get; set; } 
} 

[ProtoContract] 
class child : parent 
{ 
    [ProtoMember(2)] 
    public int num { get; set; } 
} 

如果我没有设定孩子财产 “NUM”

var obj = new child() { name = "tester" }; 

创建一个子对象,并尝试对其进行序列化

using (var stream = new MemoryStream()) 
{ 
    Serializer.NonGeneric.Serialize(stream, obj); 
} 

流将是空的。

有没有办法处理这种情况,而不使用父类的属性[ProtoInclude]?
我正在使用protobuf-net v2 r480。

感谢

回答

1

正确的答案使用ProtoInclude来告诉它的子类。否则,它只是相对于“孩子”序列化,并且没有任何有趣的数据(默认情况下,零不会被视为有趣的数据),零长度的流是正确的序列化。 Protobuf不排除空的流。

如果你不能使用ProtoInclude,因为在编译时不知道类型,那么你可以使用;

RuntimeTypeModel.Default[typeof(parent)] 
    .AddSubType(number, typeof(child)); 

需要注意的是“数字” 必须准确地重复以后,要不然也不会正确地反序列化。