Microsoft Bond 中的会员编号是什么意思?

What do member numbers mean in Microsoft Bond?

使用 Microsoft Bond (the C# library in particular),我看到每当定义一个 Bond 结构时,它看起来像这样:

struct Name
{
   0: type name;
   5: type name;
   ...
}

这些数字(0、5、...)是什么意思?

他们在继承方面需要特殊对待吗? (我是否需要确保我不会覆盖祖先中定义的具有相同编号的成员?)

字段序号是每个字段的唯一标识。当序列化为标记的二进制协议时,这些数字用于指示有效负载中的字段。不使用字段的名称。 (重命名 .bond 文件中的字段 不会 破坏序列化二进制数据的兼容性 [不过,请参阅下面关于文本协议的警告]。)数字比字符串小,这有助于减少有效载荷大小, 但也最终改善了 serialization/deserialization 时间。

您不能在同一个结构中重复使用同一个字段序号。

当您从结构继承时(或者如果您的结构中有一个结构字段),不需要特殊处理。 Bond 将结构的序号分开。具体来说,以下是合法的并且有效:

namespace inherit_use_same_ordinal;

struct Base {
    0: string field;
}

struct Derived : Base {
    0: bool field;
}

关于简单 JSON 和简单 XML 等文本序列化协议的警告:这些协议使用字段名称 作为字段标识符。因此,在这些协议中,重命名字段会破坏序列化数据的兼容性。

此外,Simple JSON 和 Simple XML 会展平继承层次结构,因此在 Base 和 Derived 中重复使用名称会导致冲突。两者都有解决这个问题的方法。对于简单 XML,SimpleXml.Settings.UseNamespaces parameter can be set to true 发出完全限定名称。

对于SimpleJSON,可以使用Bond attribute JsonName来改变SimpleJSON序列化使用的名称,避免冲突:

struct Derived : Base {
    [JsonName("derived_field")]
    0: bool field;
}