Лучшие практики развития схемы Microsoft Bond

Есть ли в Microsoft Bond рекомендации о том, как схемы развиваются с течением времени? Я хочу убедиться, что мы следуем передовым методам, чтобы у нас была двухсторонняя совместимость (то есть, позволяя нашим типам облигаций эволюционировать более старые версии в текущую версию, а также обратная совместимость, позволяющая преобразовывать более новую версию обратно в более старую версию). Я не вижу этого конкретно в документации (например, https://microsoft.github.io/bond/manual/bond_cs.html ни https://microsoft.github.io/bond/manual/compiler.html), хотя в других средах сериализации, таких как Avro, это подробно описано в их документации.

Что бы это ни стоило, мы пишем в.NET (C#/F#) и намереваемся изначально использовать форматы CompactBinaryWriter и CompactBinaryReader.

Например, я представляю некоторые рекомендации по этим направлениям:

  1. имена полей могут меняться со временем, так как для разрешения полей используются порядковые номера полей, а не имена напрямую (за исключением SimpleJSON). Я верю, что это правда, не так ли?
  2. добавление нового "обязательного" поля требует, чтобы вы дали полю значение по умолчанию
  3. удаление поля в более новой версии - это нормально, если для старых версий назначено значение по умолчанию
  4. а как насчет изменения типа поля? Например, может ли поле измениться со строкового поля в версии 1 на int64 в версии 2? Может ли он перейти от строки к пользовательскому объединению (пользовательский тип с необязательными полями)?
  5. любые другие рекомендации?

Спасибо!

также было бы интересно, если есть какие-либо активные форумные сообщества для этого типа вопроса Microsoft Bond, я не смог бы найти один...

2 ответа

Решение

Правила эволюции схемы Бонда и лучшие практики теперь можно найти здесь: https://microsoft.github.io/bond/manual/bond_cpp.html https://microsoft.github.io/bond/manual/bond_cs.html

Мне также не известны какие-либо четкие рекомендации по развитию схемы, это, безусловно, пробел в документации Bond. Исходя из моей собственной работы с Бондом, я могу ответить на некоторые ваши вопросы:

  1. Да, имена полей могут меняться, все, что имеет значение для CompactBinary Формат - это порядковый номер поля.
  2. DefaultAttribute действительно только для членов интерфейса. Вы можете добавить обязательные поля без дальнейших аннотаций, но при десериализации старых записей (которые не содержат этого обязательного поля) я ожидаю ошибку времени выполнения.
  3. Вы можете удалить поля. Значения по умолчанию определяются путем создания экземпляра содержащего объекта через его конструкторы по умолчанию и считывания соответствующего поля. Однако, если вы удалите обязательное поле, старый читатель не сможет десериализовать его (новый читатель не включил бы его вообще).
  4. Это большой нет нет. Если вам нужно изменить тип поля, оставьте старое поле на месте (добавьте суффикс, например: _Obsolete при желании) и введите новое поле "правильного" типа.

Для чего это стоит: вы пишете, что используете F#, вносятся некоторые специфичные для F# изменения, см. Здесь. Это будет поддерживать записи, объединения и основные типы данных F#.

Обновление: теперь есть раздел об эволюции схемы в документации Bond.

Другие вопросы по тегам