protobuf-netinheritance和字段编号

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

我已经阅读了之前的一个stackoverflow问题 ,这个问题得到了回答,并且帮助我完成了我的目标,但是我遇到了一个绊脚石,可能比任何真正的问题更缺乏理解!

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

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来获取AddSubType方法的fieldNumber参数。

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

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

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

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

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