2016-09-29 73 views
6

使用Microsoft Bond (the C# library in particular),我看到,每当一个债券结构的定义,它看起来像这样:微软邦德中的成员编号是什么意思?

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

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

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

+0

您链接到的文件,说'序号值必须是一个无符号16位对于一个类型中的每个字段唯一的。 – TZHX

回答

3

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

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

从结构体继承(或者如果结构体中有结构体字段),不需要特殊处理。邦德将结构的序号分开。具体而言,以下是合法的,将工作:

namespace inherit_use_same_ordinal; 

struct Base { 
    0: string field; 
} 

struct Derived : Base { 
    0: bool field; 
} 

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

此外,简单JSON和简单XML使继承层次变平,所以在Base和Derived之间重新使用名称将导致冲突。两者都有办法解决这个问题。对于简单XML,SimpleXml.Settings.UseNamespaces parameter can be set to true发出完全限定名称。

对于简单的JSON的Bond attribute JsonName可以用来更改名称,用于简单的JSON序列化,以避免冲突:

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