繁体   English   中英

protobuf-net 从基础 class 中跳过一个成员(接口类型)

[英]protobuf-net skips a member (of Interface type) from base class

我有一个Base class ,它定义了一个名为MemberIMember类型的成员。 然后我有一个Child class 继承Base并定义了一个名为Member2 IMember 我序列化了Child class 的一个实例,保存在Base类型的变量中,期望所有子成员和基本成员都被序列化。 除了当来自ChildMember2被序列化时,在Base class 中定义的具有相同类型的成员没有被序列化,(或者至少在反序列化时我得到一个 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();
    }

反序列化的 object obj具有Member == nullMember2 != null 这是为什么?

基础 class 缺少用于指定层次结构的 [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;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM