Microsoft Bond架构演变最佳实践

时间:2017-01-25 20:11:21

标签: bond

Microsoft Bond是否有一些关于模式如何随时间演变的最佳实践?我想确保我们遵循最佳实践,以便我们具有双向兼容性(即允许我们的Bond类型将旧版本发展到当前版本,以及向后兼容性允许从较新版本转换回旧版本)。我没有在文档中明确说明这一点(例如https://microsoft.github.io/bond/manual/bond_cs.htmlhttps://microsoft.github.io/bond/manual/compiler.html#idl-syntax),但其他序列化框架(例如Avro)在其文档中明确详细说明了这一点。

对于它的价值,我们用.NET编写(C#/ F#)并打算最初使用CompactBinaryWriter和CompactBinaryReader格式。

例如,我想象一下这些方面的一些指导:

  1. 字段名称可以随着时间的推移而变化,因为字段序数用于字段解析,而不是直接名称(SimpleJSON除外)。我相信这是真的,是吗?
  2. 添加新的"必需"字段要求您为字段指定默认值
  3. 删除较新版本中的字段是可以的,前提是旧版本已分配默认值
  4. 如何更改字段的类型?例如,字段是否可以从版本1中的字符串字段更改为版本2中的int64?它可以从字符串更改为自定义联合(具有可选字段的自定义类型)吗?
  5. 任何其他建议?
  6. 谢谢!

    如果有这种类型的Microsoft Bond问题有任何活跃的论坛社区,

    也会感兴趣,我无法找到...

2 个答案:

答案 0 :(得分:3)

我也不知道任何明确的架构演变指南,这肯定是Bond文档中的一个缺口。从我自己与邦德的合作中,我可以回答你的一些问题:

  1. 是的,字段名称可以更改,CompactBinary格式的所有重要内容都是字段序数。
  2. DefaultAttribute仅对接口成员有效。您可以添加必需的字段而无需进一步注释,但在对旧记录(不包含该必填字段)进行反序列化时,我预计会出现运行时错误。
  3. 您可以删除字段。默认值是通过其默认构造函数实例化包含对象并读出相应字段来确定的。但是,如果删除必填字段,旧阅读器将无法对其进行反序列化(新阅读器根本不会包含它)。
  4. 这是一个很大的不。如果您需要更改字段的类型,请保留旧字段(如果需要,请为其添加_Obsolete后缀)并引入"更正"的新字段。类型。
  5. 为了它的价值:你写下你正在使用F#,一些F#特定的更改正在制作中,请参阅here。这将支持记录,联合和核心F#数据类型。

    更新:Bond文档中现在有section on schema evolution

答案 1 :(得分:-1)