6

我正在使用 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。

4

1 回答 1

6

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

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

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

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

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

于 2012-08-08T17:04:35.337 回答