【问题标题】:protobuf-net Inheritance & Field Numbersprotobuf-net 继承和字段编号
【发布时间】:2012-02-14 13:57:20
【问题描述】:

我正在尝试为我们的应用程序构建一个必须能够处理继承的序列化系统。更复杂的是,应用程序是可扩展的,因此在编译时可能不太可能知道类型。

我已经阅读了previous stackoverflow question 得到了答复,这帮助我实现了目标,但我遇到了一个绊脚石,可能更多的是缺乏理解而不是任何实际问题!

所以这是我目前的代码......

public interface IBaseFrame
{

}

public class BasicDataFrame : IBaseFrame
{

}

public class AnotherFrame : BasicDataFrame
{

}

。 . . .

RuntimeTypeModel model = TypeModel.Create();
MetaType baseType = model.Add(typeof(IBaseFrame), true);
MetaType basicFrameType = model.Add(typeof(BasicDataFrame),true);

baseType.AddSubType(7, typeof(BasicDataFrame));
model.Add(typeof(AnotherFrame), true);

basicFrameType.AddSubType(8, typeof(AnotherFrame));

现在这段代码可以正常工作(据我所知!),世界上一切都很好......我担心的是上面代码中的值 7 和 8 用于 fieldNumber em> AddSubType 方法的参数。

当插件被枚举时,我正在使用 SerialisationManager 注册它们的帧类型,并使用 fieldNumber 的递增计数器将它们添加到模型中(我以任意大的数字开始,所以我不不必担心将来扩展基类)。

我担心如果插件以不同的顺序枚举或添加(或删除)新插件,那么自动生成的 fieldNumber 对于不同的子类型将会有所不同,然后导致在用户(可能有不同的插件,因此有不同的子类型)甚至同一系统上的文件之间共享日志文件时出现问题,当插件可能已被删除时。

是否有任何巧妙的方法可以自动处理这种继承,而不会在将来引入兼容性问题,或者当插件发生变化时,或者我是否需要想出一种机制来处理这些 fieldNumbers保证在所有安装中保持不变?

任何可以提供的帮助或建议将不胜感激!

【问题讨论】:

  • 刚刚意识到我应该提到我正在使用网站上的版本 2 的测试版 - r480。

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


【解决方案1】:

这里没有魔法;这些数字本质上是合同的一部分,如果您想反序列化之前存储的数据,那么能够可靠地复制它们很重要。如果在编译时无法知道数据,则配置或某些外部类型的字段编号注册表可能会有所帮助。您的担忧是准确的。

【讨论】:

  • 我也很怀疑!哦,好吧..即使应用程序可以通过插件机制进行扩展,它通常也会是我们自己公司内的某个人(或“受信任的”第三方)创建插件,因此我们必须实施某种流程来发布号码.幸运的是,我们已经有一个属性来装饰每个 FrameType 并提供一些元数据,我们可以在其中添加一个 fieldNumber - 我只是想验证我们没有可以使用的魔法!使用非连续的“大”数字是否有任何潜在的陷阱?
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多