我正在使用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。
答案 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(...)]