首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >protobuf-net跳过基类中的成员(接口类型)

protobuf-net跳过基类中的成员(接口类型)
EN

Stack Overflow用户
提问于 2020-07-14 10:33:23
回答 1查看 28关注 0票数 1

我有一个Base类,它定义一个名为MemberIMember类型的成员。然后我有一个继承BaseChild类,并定义了一个名为Member2的新成员IMember。我序列化了Child类的一个实例,该实例保存在Base类型的变量中,期望所有的子成员和基成员都被序列化。除了来自ChildMember2是序列化的,在Base类中定义的具有相同类型的成员不是序列化的(或者至少在反序列化时,它的值是null )

我的类完全是这样的:

代码语言:javascript
运行
复制
    [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;
        
    }

测试代码如下:

代码语言:javascript
运行
复制
    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();
    }

反序列化的对象obj具有Member == null,而具有Member2 != null。为什么会这样呢?

EN

Stack Overflow用户

回答已采纳

发布于 2020-07-15 04:16:29

基类缺少用于指定层次结构的ProtoInclude属性。

代码语言:javascript
运行
复制
[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;

}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62887165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档