#bond
#связь
Вопрос:
Используя Microsoft Bond (в частности, библиотеку C #), я вижу, что всякий раз, когда определяется структура связи, она выглядит следующим образом:
struct Name
{
0: type name;
5: type name;
...
}
Что означают эти цифры (0, 5, …)?
Требуют ли они особого обращения при наследовании? (Нужно ли мне убедиться, что я не переопределяю участников с тем же номером, который определен в моем предке?)
Комментарии:
1. В документации, на которую вы ссылались, говорится
The ordinal value must an unsigned 16-bit integer, unique for each field within a type.
.
Ответ №1:
Порядковые номера полей являются уникальными идентификаторами каждого поля. При сериализации в двоичные протоколы с тегами эти номера используются для указания, какие поля находятся в полезной нагрузке. Имена полей не используются. (Переименование поля в файле .bond не нарушает совместимость с сериализованными двоичными данными [хотя см. Предостережение ниже о текстовых протоколах].) Числа меньше строк, что помогает уменьшить размер полезной нагрузки, но также улучшает время сериализации / десериализации.
Вы не можете повторно использовать один и тот же порядковый номер поля в одной и той же структуре.
При наследовании от структуры (или если у вас есть поле struct внутри вашей структуры) специальная обработка не требуется. Bond сохраняет порядковые номера для структур отдельно. Конкретно, следующее является законным и будет работать:
namespace inherit_use_same_ordinal;
struct Base {
0: string field;
}
struct Derived : Base {
0: bool field;
}
Предостережение относительно протоколов сериализации текста, таких как Simple JSON и Simple XML: эти протоколы используют имя поля в качестве идентификатора поля. Итак, в этих протоколах переименование поля нарушает совместимость сериализованных данных.
Кроме того, простой JSON и простой XML выравнивают иерархию наследования, поэтому повторное использование имен между базовыми и производными приведет к конфликтам. У обоих есть способы обойти это. Для простого XML для SimpleXml.Settings.UseNamespaces
параметра можно установить значение true
для выдачи полных имен.
Для простого JSON атрибут Bond JsonName
можно использовать для изменения имени, используемого для простой сериализации JSON, чтобы избежать конфликта:
struct Derived : Base {
[JsonName("derived_field")]
0: bool field;
}