2016-09-29 4 views
6

Использование Microsoft Bond (the C# library in particular), я вижу, что всякий раз, когда структура Bond определен, он выглядит следующим образом:Что означают номера членов в Microsoft Bond?

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; 
} 

Протест о текстовых сериализации протоколов, таких как Simple JSON и XML Simple: эти протоколы используют имя поля в качестве идентификатора поля. Таким образом, в этих протоколах переименование поля прерывает сериализованную совместимость данных.

Кроме того, простые JSON и Simple 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; 
} 
Смежные вопросы