使用Microsoft Bond (the C# library in particular),我看到只要定义了Bond结构,它就看起来像这样:

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

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

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

最佳答案

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

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

从结构继承(或在结构内部有结构字段)时,不需要特殊处理。邦德将结构的序号分开。具体来说,以下内容是合法的,并且会起作用:

namespace inherit_use_same_ordinal;

struct Base {
    0: string field;
}

struct Derived : Base {
    0: bool field;
}

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

此外,简单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;
}

关于bond - 成员(member)编号在Microsoft Bond中是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39767118/

10-12 19:17