在protobuf-net中继承的序列化

时间:2012-10-01 13:18:02

标签: c# serialization protobuf-net

给出一个如下所示的.proto:

message Base {
    string Dummy = 1
}

message Derived {
    Base Super = 1
    string Parp = 2 
}

......还有一些C#之类的东西:

public class Base {
    public string Dummy;
}

public class Derived : Base {
    public string Parp
}

如何在protobuf-net中自定义序列化以便能够做到这一点?最初我开始考虑使用TypeModel并为Base MetaType调用AddSubType,但是它似乎为Base创建了所有派生类的可选字段的类型定义(即与我要求的相反)

我以为自己可以自己走层次结构,但是看看TypeModel,它似乎支持将类型提供给Deserialise,但它在序列化期间使用了value.GetType()。即便如此,我还不清楚如何做到这一点。我唯一的选择是使用ProtoWriter手动编写每个字段吗?这就是我目前的尝试,但我希望有一种更简单的方法。

1 个答案:

答案 0 :(得分:2)

首先要注意的是protobuf本身不支持继承。这没有“官方”布局。 Protobuf-net不会按照您的方式支持序列化:选择子类型封装(而不是基本类型封装)来解决几个问题,包括:

  • 满足Liskov替代原则
  • 当调用者不知道/期望序列化类型
  • 时正常工作
  • 基本上,工作(除了最简单的例子之外的任何事情,两端都知道他们正在准确地知道哪个子类型,这在很大程度上打败了多态性点)

但是,你可以手动映射DTO,基本上你的DTO层根本不使用继承。