使用子类展开protobuf消息

时间:2011-06-27 14:38:12

标签: c# serialization protobuf-net

我有两个类要转换为protobuf消息:

[ProtoContract]
class ClassA {
    [ProtoMember(1)]
    public int b;
    [ProtoMember(2)]
    public int c;
}

[ProtoContract]
class ClassD : ClassA
{
    [ProtoMember(3)]
    public int e;
    [ProtoMember(4)]
    public int f;
}

我想要实现的是包含b和c的ClassA的序列化。当序列化ClassD时,我会得到b,c,e和f。

这可能,或者我应该使用什么样的方法?我试图避免嵌套消息。

使用我的方法在序列化ClassD对象时遇到问题。

ClassD d = new ClassD();
Serialize.Serialize<ClassA>(stream, d);
Serialize.Serialize<ClassD>(stream, d);

在上述两次尝试中,序列化数据仅包含ClassD中的属性,而不包含ClassA中的属性。 我希望在第一种情况下,ClassD中至少没有一个属性被序列化 我希望所有人都可以在第二种情况下序列化ClassA和ClassD。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

不确定

[ProtoContract, ProtoInclude(3, typeof(ClassD))]
class ClassA {...}

“3”可以是任何东西,只要它不与ClassA的其他任何一个冲突。

在线上显示为嵌套消息,但会自动显示。如果这明确地你想要什么,请告诉我。

答案 1 :(得分:1)

看起来这样在v2 中没有继承:

    var model = TypeModel.Create();
    model.Add(typeof(ClassA), false).Add("b", "c");
    model.Add(typeof(ClassD), false).Add("b", "c", "e", "f");

    var a = new ClassA { b = 1, c = 2 };
    var aClone = (ClassA)model.DeepClone(a);
    Debug.Assert(aClone.b == 1);
    Debug.Assert(aClone.c == 2);

    var d = new ClassD { b = 1, c = 2, e = 3, f = 4};
    var dClone = (ClassD)model.DeepClone(d);
    Debug.Assert(dClone.b == 1);
    Debug.Assert(dClone.c == 2);
    Debug.Assert(dClone.e == 3);
    Debug.Assert(dClone.f == 4);

这些都是平面模型,而不是嵌套模型。目前这需要显式设置(如上所述),因为它不是默认情况下构建模型的一部分 - 但作为推论,你不需要这里的属性:

class ClassA
{
    public int b;
    public int c;
}
class ClassD : ClassA
{
    public int e;
    public int f;
}