Microsoft Bond 是否有一些关于架构如何随时间演变的最佳实践?我想确保我们遵循最佳实践,以便我们具有两种方式的兼容性(即允许我们的 Bond 类型将旧版本演变成当前版本,以及向后兼容性允许从较新版本转换回旧版本)。我没有在文档中看到具体解决这个问题(例如https://microsoft.github.io/bond/manual/bond_cs.html nor https://microsoft.github.io/bond/manual/compiler.html#idl-syntax),尽管其他序列化框架(例如 Avro)在其文档中明确详细说明了这一点。
无论如何,我们正在使用 .NET (C#/F#) 进行编写,并打算最初使用 CompactBinaryWriter 和 CompactBinaryReader 格式。
例如,我想象一些这样的指导:
- 字段的名称可能会随着时间的推移而改变,因为字段序数用于字段解析,而不是直接使用名称(SimpleJSON 中除外)。我相信这是真的,是吗?
- 添加新的“必填”字段需要您为该字段指定默认值
- 删除较新版本中的字段是可以的,前提是旧版本已分配默认值
- 改变字段的类型怎么样?例如,字段可以从版本 1 中的字符串字段更改为版本 2 中的 int64 字段吗?它可以从字符串更改为自定义联合(带有可选字段的自定义类型)吗?
- 还有其他建议吗?
谢谢你!
如果有针对此类 Microsoft Bond 问题的活跃论坛社区,我也会感兴趣,但我找不到......
我也不知道有任何明确的模式演化指南,这肯定是 Bond 文档中的一个空白。根据我自己与邦德的合作,我可以回答你的一些问题:
- 是的,字段名称可以更改,这对
CompactBinary
format 是字段序数。
- The
DefaultAttribute
仅对接口成员有效。您可以添加必填字段而无需进一步注释,但在反序列化旧记录(不包含该必填字段)时,我预计会出现运行时错误。
- 您可以删除字段。默认值是通过默认构造函数实例化包含对象并读出相应字段来确定的。但是,如果删除必填字段,旧读取器将无法反序列化它(新读取器根本不会包含它)。
- 这是一个很大的禁忌。如果您需要更改字段的类型,请将旧字段保留在原处(给它一个后缀,例如
_Obsolete
如果需要)并引入“正确”类型的新字段。
其价值在于:您写道您正在使用 F#,一些 F# 特定更改正在进行中,请参阅here。这将支持记录、联合和核心 F# 数据类型。
Update:现在有一个关于模式演化的部分在债券文件中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)