3

给定一个看起来像这样的 .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 手动编写每个字段吗?这是我目前正在尝试的,但我希望有更简单的方法。

4

1 回答 1

2

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

  • 满足 Liskov 替换原则
  • 当调用者不知道/预期序列化类型时正常工作
  • 基本上,完全可以工作(除了最简单的例子,两端都提前知道他们得到了哪个子类型,这在很大程度上违背了多态性的观点)

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

于 2012-10-01T14:46:43.463 回答