protobuf-net 版本容差

Posted

技术标签:

【中文标题】protobuf-net 版本容差【英文标题】:protobuf-net Version Tolerance 【发布时间】:2013-09-25 14:35:46 【问题描述】:

Earlier question

我希望在可再发行库包中使用protobuf-net,该库包将被合并到多个应用程序中。每个应用程序都需要能够打开由库序列化的文件,操作对象,然后保存/序列化回文件。当然,版本控制在这里成为一个大问题。如果旧版本往返于从新版本生成的文件,我不想丢失数据。然后我找到了ProtoBuf.Extensible 基类,但很快发现ProtoBuf.IExtensible 不支持具有继承的类。我绝对有继承权。

我在这里有什么选择吗?我开始觉得具有版本容差的序列化和最简单的类之外的任何东西都是白日梦。

【问题讨论】:

【参考方案1】:

与大多数事情一样:功能需要努力设计、实施、测试和支持。继承和可扩展的结合并不是我迄今为止需要/要求进行全面调查的东西。我确信它是可以解决的,但是:它并非完全微不足道。请记住,原始 protobuf(Google 规范)根本不包括继承:p

目前,状态只是“不受支持的用例”。没有可以添加的魔法[MakeItWork]。这需要一些思考等。

【讨论】:

真可惜,我喜欢[MakeItWork]magic one-liners ;) 我打算明天看看源代码。 @Ethan 警告:大量的元编程。 IIRC,TypeSerializer 是这里的关键类型。然而,这里的问题主要是设计问题:如何真正正确地往返此类数据。可能问题实际上是“添加扩展数据”方法 - 也许它们需要一个类型限定符(可能仅在继承情况下)来指示数据假设存在的级别。

以上是关于protobuf-net 版本容差的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net 版本 2.X 到 3.X 迁移

使用 protobuf-net 进行枚举序列化

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

protobuf-net 中的人类可读表示

protobuf-net:如何注释派生类型的属性?

protobuf-net 保留未来字段