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