protobuf-net继承&场数

时间:2012-02-14 13:57:20

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

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

我已经阅读了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 AddSubType方法的参数。

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

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

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

非常感谢任何可以给予的帮助或建议!

1 个答案:

答案 0 :(得分:2)

这里没有魔力;这些数字基本上是合同的一部分,如果您想要反序列化先前存储的数据,则可以可靠地重现这些数字。如果在编译时无法获知数据,则可能需要配置或某些外部类型到字段编号的注册表可能会有所帮助。您的疑虑是准确的。