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

时间:2012-08-08 16:57:15

标签: 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; }
    }

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

1 个答案:

答案 0 :(得分:6)

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

int tag = 7; // why not
Type subType = typeof(SuperHero);

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

RuntimeTypeModel.Default.Add(typeof(Person), true).AddSubType(tag, subType);

这相当于属性处理代码在看到[ProtoInclude(...)]

时所执行的操作