8

使用Microsoft Bond(特别是 C# 库),我看到每当定义 Bond 结构时,它看起来像这样:

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

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

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

4

1 回答 1

4

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

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

当您从结构继承时(或者如果您的结构中有一个结构字段),则不需要特殊处理。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参数可以设置true为发出完全限定的名称。

对于 Simple JSON,Bond 属性JsonName可用于更改 Simple JSON 序列化使用的名称,以避免冲突:

struct Derived : Base {
    [JsonName("derived_field")]
    0: bool field;
}
于 2016-09-29T16:14:52.773 回答