3

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. 还有其他建议吗?

谢谢!

如果有针对此类 Microsoft Bond 问题的任何活跃论坛社区,我也会感兴趣,但我找不到...

4

2 回答 2

3

我也不知道有任何明确的模式演变指南,这肯定是 Bond 文档中的一个空白。根据我自己与 Bond 的合作,我可以回答您的一些问题:

  1. CompactBinary是的,字段的名称可以更改,格式的所有问题都是字段序号。
  2. DefaultAttribute仅对接口成员有效。您可以添加必填字段而无需进一步注释,但在反序列化旧记录(不包含该必填字段)时,我预计会出现运行时错误。
  3. 您可以删除字段。默认值是通过通过其默认构造函数实例化包含对象并读出相应字段来确定的。但是,如果您删除必填字段,旧阅读器将无法反序列化它(新阅读器根本不会包含它)。
  4. 这是一个很大的不。如果您需要更改字段的类型,请将旧字段留在原处(_Obsolete如果需要,可以给它一个后缀)并引入一个“正确”类型的新字段。

对于它的价值:您写道您正在使用 F#,一些 F# 特定的更改正在进行中,请参见此处。这将支持记录、联合和核心 F# 数据类型。

更新: Bond 文档中现在有一个关于模式演变的部分。

于 2017-01-26T09:49:31.430 回答
-1

现在可以在此处找到 Bond 模式演变规则和最佳实践: https ://microsoft.github.io/bond/manual/bond_cpp.html#schema-evolution https://microsoft.github.io/bond/manual/bond_cs .html#schema-evolution

于 2017-02-13T22:42:05.887 回答