Синтаксис 3 protobuf сделал все поля необязательными, исключая ключевые слова required
и optional
из предыдущего синтаксиса proto2. Читая некоторые комментарии разработчиков, кажется, что это было сделано для улучшения прямой / обратной двоичной совместимости.
Но для меня это может быть реализовано путем простого управления версиями имен пакетов, скажем, com.example.messages.v1
а затем позволить клиентам реализовывать десериализаторы, которые они понимают. В то же время он удаляет некоторые контракты, указанные как тип, которые полезны с точки зрения разработки программного обеспечения. Например, если у меня есть
message Location {
double latitude = 1;
double longitude = 2;
}
В proto3 можно создать половинную резервную копию, но она полностью действительна, Location
если не предоставить одно из обязательных полей.
Разве это не большой недостаток при создании формата сериализации на основе схемы для обмена данными между клиентами? Не хуже ли передать дополнительный код проверки каждому клиенту, проверяя, что все обязательные поля имеют допустимые значения?
источник
Ответы:
Proto3 вносит ряд изменений, направленных (насколько я понимаю), чтобы сделать его гораздо более удобным для использования в кроссплатформенных сценариях. Явное отслеживание «назначенных» и «не назначенных, но сообщающих о значении по умолчанию» может быть очень трудным для реализации на некоторых целевых платформах, а также может привести к путанице в использовании. Таким образом, proto3 использует гораздо более простой подход:
Другое значение: ноль. Тот факт , что вы не явно назначить его к нулю спорно. Является ли это желательным или нет, зависит от вас, но для меня это имеет смысл, и именно так много «инициализации нового объекта / структуры» работает на широком спектре платформ.
Там нет ничего, чтобы проверить! Компоновка - это именно то, что было бы, если бы нулевое значение было назначено явно. Если это законно, это законно. Если это незаконно (потому что ноль не имеет смысла для вас), это незаконно; но это было бы незаконно, было ли это явным или неявным. Количество проверок не меняется.
Не обычно, нет ... тем более что версия схемы является явной. Если вы хотите использовать proto2: используйте proto2. Ничто не меняется автоматически.
источник