对带有继承的ProtoBuf-Net有疑问吗?

时间:2019-07-11 11:22:18

标签: c# .net protocol-buffers protobuf-net

我想使用protobuf来通过套接字连接使用该协议。

我的问题是关于继承的。

说我的项目中有以下课程:

  1. 动物
  2. 猫(继承自动物)
  3. 狗(继承自动物)

让我们说:

  1. 动物从Creature继承而来,后者是DLL中的一个类,我无法修改其代码(假设它是第3方库)。
  2. Cat有10个字段,我为此属性指定了ProtoMember 1到10。
  3. 将狗作为12个字段,所以我给ProtoMember 1至12。
  4. 动物有5个字段,所以我给ProtoMember 1至5。

到目前为止很好。

为了处理继承,假设我在Cat上使用以下属性:

[ProtoInclude(11, typeof(Pet))]

然后在Dog上使用:

[ProtoInclude(13, typeof(Pet))]

关于动物用途:

[ProtoInclude(6, typeof(Creature))]

问题:

  1. 我到目前为止使用的这些数字是否全部有效?如果不是,它们应该是什么?其原因是什么?
  2. 我应该在ProtoInclude中给数字加上一个空格(例如111、113和106),以便允许将新字段添加到这些类中吗?还是我保持数字系列的紧凑性并在将来需要时进行调整?

因此,要处理Creature的继承(该代码不在我的项目中),我相信我必须使用运行时类型声明(如此处所述:protobuf-net inheritance

我不确定这个示例需要什么语句,这些语句也需要放在项目中的什么位置?

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

[ProtoInclude]适用于从基类到子类的工作-您需要注释 base 类型-因此:需要{{1}来声明{{1 }} Pet[ProtoInclude(...)]的标记。同样,Cat需要声明它期望Dog。如果您不控制Creature,显然这是一个问题,但是如果有问题,可以在运行时通过Animal对此 进行配置。就个人而言,我不建议使用在序列化层次结构中不受控制的类型。

但是对您的问题:

  1. 没关系,只要它与声明类型上的其他数字不冲突即可;更低的价格更便宜(Creature的编码比RuntimeTypeModel便宜)
  2. 完全取决于您;常规字段和子类型字段是否交错都没有关系,因此拥有它不是问题
12

但是我承认许多人喜欢将2分开-也许

34134923