使用Microsoft Bond (the C# library in particular),我看到只要定义了Bond结构,它就像这样:
struct Name
{
0: type name;
5: type name;
...
}
这些数字(0,5,......)是什么意思?
他们需要继承特殊待遇吗? (我是否需要确保不覆盖我祖先中定义的相同编号的成员?)
答案 0 :(得分:4)
田间序数是每个田地的唯一身份。序列化为标记的二进制协议时,这些数字用于指示有效负载中的哪些字段。不使用字段的名称。 (重命名.bond文件中的字段不会打破序列化的二进制数据兼容性[虽然,请参阅下面关于文本协议的警告]。)数字小于字符串,这有助于减少有效负载大小,但也最终改进序列化/反序列化时间。
您不能在同一个结构中重复使用相同的字段序号。
从结构继承时(或者如果结构中有结构字段),不需要特殊处理。邦德将结构的序数分开。具体而言,以下是合法的,并将起作用:
namespace inherit_use_same_ordinal;
struct Base {
0: string field;
}
struct Derived : Base {
0: bool field;
}
关于文本序列化协议(如Simple JSON和Simple XML)的警告:这些协议使用字段名称作为字段标识符。因此,在这些协议中,重命名字段会破坏序列化数据兼容性。
此外,Simple JSON和Simple XML展平了继承层次结构,因此在Base和Derived中重复使用名称将导致冲突。两者都有办法解决这个问题。对于Simple XML,SimpleXml.Settings.UseNamespaces
parameter can be set to true
发出完全限定名称。
对于Simple JSON,Bond attribute JsonName
可用于更改用于Simple JSON序列化的名称,以避免冲突:
struct Derived : Base {
[JsonName("derived_field")]
0: bool field;
}