Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# protobuf net从基类跳过一个成员(接口类型)_C#_Protobuf Net - Fatal编程技术网

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个小时的编程,我昨天看不到那个错误。但你是对的,这是一个相当抽象的例子。我正在对你的引擎进行一些测试。这不是一个真实的场景。然而,它实际上工作得很好。