C# protobuf net从基类跳过一个成员(接口类型)
我有一个C# protobuf net从基类跳过一个成员(接口类型),c#,protobuf-net,C#,Protobuf Net,我有一个Base类,它定义了IMember类型的成员,名为member。然后我有一个Child类继承Base,并定义一个名为Member2的新成员IMember。 我序列化了Child类的一个实例,该实例保存在Base类型的变量中,希望序列化所有子成员和基成员。除了当Child中的Member2被序列化时,在Base类中定义的具有相同类型的成员不会被序列化(或者至少在反序列化时,其值为null) 我的课程是这样的: [ProtoContract] [ProtoInclude(10
Base
类,它定义了IMember
类型的成员,名为member
。然后我有一个Child
类继承Base
,并定义一个名为Member2
的新成员IMember
。
我序列化了Child
类的一个实例,该实例保存在Base
类型的变量中,希望序列化所有子成员和基成员。除了当Child
中的Member2
被序列化时,在Base
类中定义的具有相同类型的成员不会被序列化(或者至少在反序列化时,其值为null)
我的课程是这样的:
[ProtoContract]
[ProtoInclude(100, typeof(Member))]
public interface IMember {
[ProtoMember(1, IsRequired = true)]
int value { get; set; }
}
[ProtoContract()]
public class Member : IMember {
[ProtoMember(1, IsRequired = true)]
public int value { get; set; }
}
[ProtoContract()]
public class Base {
[ProtoMember(1, IsRequired = true)]
public virtual string Name { get; set; } = "Base";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember { get; set; } = null;
}
[ProtoContract()]
public class Child : Base {
[ProtoMember(1, IsRequired = true)]
public override string Name { get; set; } = "Child";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember2 { get; set; } = null;
}
static void Main(string[] args) {
Base b = new Child() {
MyMember = new Member() { value = 10 },
MyMember2 = new Member() { value = 20 }
};
var stream = new MemoryStream();
Serializer.Serialize(stream, b);
var bytes = stream.ToArray();
stream = new MemoryStream(bytes);
var obj = Serializer.Deserialize<Child>(stream);
Console.ReadLine();
}
测试代码如下所示:
[ProtoContract]
[ProtoInclude(100, typeof(Member))]
public interface IMember {
[ProtoMember(1, IsRequired = true)]
int value { get; set; }
}
[ProtoContract()]
public class Member : IMember {
[ProtoMember(1, IsRequired = true)]
public int value { get; set; }
}
[ProtoContract()]
public class Base {
[ProtoMember(1, IsRequired = true)]
public virtual string Name { get; set; } = "Base";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember { get; set; } = null;
}
[ProtoContract()]
public class Child : Base {
[ProtoMember(1, IsRequired = true)]
public override string Name { get; set; } = "Child";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember2 { get; set; } = null;
}
static void Main(string[] args) {
Base b = new Child() {
MyMember = new Member() { value = 10 },
MyMember2 = new Member() { value = 20 }
};
var stream = new MemoryStream();
Serializer.Serialize(stream, b);
var bytes = stream.ToArray();
stream = new MemoryStream(bytes);
var obj = Serializer.Deserialize<Child>(stream);
Console.ReadLine();
}
static void Main(字符串[]args){
基本b=新的子项(){
MyMember=新成员(){value=10},
MyMember2=新成员(){value=20}
};
var stream=newmemoryStream();
Serializer.Serialize(流,b);
var bytes=stream.ToArray();
流=新内存流(字节);
var obj=序列化程序。反序列化(流);
Console.ReadLine();
}
反序列化对象
obj
具有Member==null
而Member2!=空
。这是为什么?基类缺少用于指定层次结构的[ProtoInclude]属性
[ProtoContract()]
[ProtoInclude(100, typeof(Child))]
public class Base {
[ProtoMember(1, IsRequired = true)]
public virtual string Name { get; set; } = "Base";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember { get; set; } = null;
}
基类缺少用于指定层次结构的[ProtoInclude]属性
[ProtoContract()]
[ProtoInclude(100, typeof(Child))]
public class Base {
[ProtoMember(1, IsRequired = true)]
public virtual string Name { get; set; } = "Base";
[ProtoMember(2, IsRequired = true)]
public IMember MyMember { get; set; } = null;
}
您似乎试图在这里设置双重层次结构,在接口上使用继承,但实际上是通过类(不定义继承)序列化的。如果有选择,这里基于类的继承比基于接口的继承更可靠。坦率地说,我的建议是:丢失接口(或者至少:不要让接口参与序列化)。要解开你在这里试图建立的模型有点困难,所以我正在努力重写它作为一个例子。也许你能解释一下这个场景吗?发现了问题。。。我在基类中缺少[ProtoInclude(100,typeof(Child))]。添加了它,一切正常:)谢谢@MarcGravel。。。经过10个小时的编程,我昨天看不到那个错误。但你是对的,这是一个相当抽象的例子。我正在对你的引擎进行一些测试。这不是一个真实的场景。然而,它实际上工作得很好。您似乎试图在这里设置双重层次结构,在接口上使用继承,但实际上您通过类(不定义继承)进行序列化。如果有选择,这里基于类的继承比基于接口的继承更可靠。坦率地说,我的建议是:丢失接口(或者至少:不要让接口参与序列化)。要解开你在这里试图建立的模型有点困难,所以我正在努力重写它作为一个例子。也许你能解释一下这个场景吗?发现了问题。。。我在基类中缺少[ProtoInclude(100,typeof(Child))]。添加了它,一切正常:)谢谢@MarcGravel。。。经过10个小时的编程,我昨天看不到那个错误。但你是对的,这是一个相当抽象的例子。我正在对你的引擎进行一些测试。这不是一个真实的场景。然而,它实际上工作得很好。