Лучшие практики развития схемы 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.
Например, я представляю некоторые рекомендации по этим направлениям:
- имена полей могут меняться со временем, так как для разрешения полей используются порядковые номера полей, а не имена напрямую (за исключением SimpleJSON). Я верю, что это правда, не так ли?
- добавление нового "обязательного" поля требует, чтобы вы дали полю значение по умолчанию
- удаление поля в более новой версии - это нормально, если для старых версий назначено значение по умолчанию
- а как насчет изменения типа поля? Например, может ли поле измениться со строкового поля в версии 1 на int64 в версии 2? Может ли он перейти от строки к пользовательскому объединению (пользовательский тип с необязательными полями)?
- любые другие рекомендации?
Спасибо!
также было бы интересно, если есть какие-либо активные форумные сообщества для этого типа вопроса Microsoft Bond, я не смог бы найти один...
2 ответа
Правила эволюции схемы Бонда и лучшие практики теперь можно найти здесь: https://microsoft.github.io/bond/manual/bond_cpp.html https://microsoft.github.io/bond/manual/bond_cs.html
Мне также не известны какие-либо четкие рекомендации по развитию схемы, это, безусловно, пробел в документации Bond. Исходя из моей собственной работы с Бондом, я могу ответить на некоторые ваши вопросы:
- Да, имена полей могут меняться, все, что имеет значение для
CompactBinary
Формат - это порядковый номер поля. DefaultAttribute
действительно только для членов интерфейса. Вы можете добавить обязательные поля без дальнейших аннотаций, но при десериализации старых записей (которые не содержат этого обязательного поля) я ожидаю ошибку времени выполнения.- Вы можете удалить поля. Значения по умолчанию определяются путем создания экземпляра содержащего объекта через его конструкторы по умолчанию и считывания соответствующего поля. Однако, если вы удалите обязательное поле, старый читатель не сможет десериализовать его (новый читатель не включил бы его вообще).
- Это большой нет нет. Если вам нужно изменить тип поля, оставьте старое поле на месте (добавьте суффикс, например:
_Obsolete
при желании) и введите новое поле "правильного" типа.
Для чего это стоит: вы пишете, что используете F#, вносятся некоторые специфичные для F# изменения, см. Здесь. Это будет поддерживать записи, объединения и основные типы данных F#.
Обновление: теперь есть раздел об эволюции схемы в документации Bond.