我有两个类要转换为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。
我该如何解决这个问题?
答案 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;
}