Protobuf.net:如何在没有[ProtoInclude]的情况下处理继承

Jan*_*sky 5 c# serialization protocol-buffers protobuf-net

我正在使用Protobuf.net来序列化一些类.我希望能够序列化SuperHero类(如下),而无需在基类上指定[ProtoInclude].这是因为派生类是自动生成的,但基类不是,因此基​​类不直接知道它的派生类.

    [ProtoContract]
    class Person
    {
        [ProtoMember(1)]
        public int Id { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
    }

    [ProtoContract]
    class SuperHero : Person
    {
        [ProtoMember(3)]
        public string Powers { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我使用的是最新版本的protobuf.net.

Mar*_*ell 6

首先注意:在某些时候,您的代码必须知道子类 - 可能通过配置.重要的是,您能够以某种方式可靠地为每个子类型重现数字.如果要将数据存储到磁盘等,则在运行时找到类型时递增计数器是不够的,因为下次运行时可能找不到相同顺序的类型.所以; 让我们假设通过某种机制,你有一个唯一的正整数,代表SuperHero作为Person的子类:

int tag = 7; // why not
Type subType = typeof(SuperHero);
Run Code Online (Sandbox Code Playgroud)

然后,告诉protobuf-net关于这个子类型:

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType);
Run Code Online (Sandbox Code Playgroud)

这相当于属性处理代码在看到时所执行的操作 [ProtoInclude(...)]