protobuf-net继承&;字段编号
本文关键字:字段 编号 amp 继承 protobuf-net | 更新日期: 2023-09-27 18:24:38
我正试图为我们的应用程序构建一个串行化系统,该系统必须能够处理继承。更为复杂的是,应用程序是可扩展的,因此在编译时可能不太可能知道类型。
我已经通读了之前的一个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));
现在这个代码工作正常(据我所知!),世界上一切都很好。。。我关心的是,在AddSubType方法的fieldNumber参数的上面代码中,值7和8的使用位置。
当插件被枚举时,我正在SerializationManager中注册它们的帧类型,并使用fieldNumber的递增计数器将它们添加到模型中(我以任意大的数字开始,这样我就不必担心将来扩展基类了)。
我担心,如果插件以不同的顺序枚举,或者添加(或删除)新的插件,那么自动生成的fieldNumber对于不同的子类型将不同,这将导致用户之间共享日志文件(他们可能有不同的插件,因此也有不同的子类)的问题,甚至在删除插件时在同一系统上共享文件的问题。
是否有任何巧妙的方法可以自动处理这种继承,而不会在未来或插件更改时引入兼容性问题,或者我是否需要制定一种机制,确保这些fieldNumber在所有安装中保持一致?
如能提供任何帮助或建议,我们将不胜感激!
这里没有魔法;数字本质上是契约的一部分,如果您想反序列化以前存储的数据,那么它们能够可靠地复制是很重要的。如果在编译时无法知道数据,那么配置或某种类型到字段号的外部注册表可能会有所帮助。您的担忧是准确的。