1

我试图使用 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。

谢谢

4

1 回答 1

1

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

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

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

请注意,“数字”必须在以后准确地重复,否则将无法正确反序列化。

于 2012-07-13T17:45:22.790 回答