Как можно воспроизвести функциональность неизвестного поля в proto3?

Google удалил неизвестные поля в proto3. Я хотел бы услышать аргументы, стоящие за этим выбором. Кроме того, если у кого-то есть способ воспроизвести поведение proto2, я хотел бы это услышать.

Если это важно, мы пишем наш код на Go.

Поскольку proto3 и grpc разрабатывались параллельно, я также хотел обратиться к сообществу grpc.

Источник: Удаление неизвестных полей


person Joshua    schedule 08.04.2015    source источник
comment
Дело не в том, к кому вы обращаетесь. Вы задаете вопрос о буферах протокола. gRPC - другое дело. Конечно, они связаны, но ваш вопрос не о gRPC.   -  person murgatroid99    schedule 09.04.2015
comment
Кажется, они мало что сказали. Предполагаю, что, возможно, он очистит интерфейс: gRPC просто заполняет ваши структуры тогда как proto должен передать вам сообщение (и вы необходимо передать его, чтобы ваше приложение оставалось безопасным в неизвестном направлении). Они, возможно, посчитали более безопасным совместное обновление вызывающих и вызываемых абонентов, точно так же, как, скажем, когда метод Go добавляет параметр, который также необходимо обновить вызывающим абонентам. В качестве обходного пути, возможно, вы могли бы использовать карты proto3 для новых полей.   -  person twotwotwo    schedule 30.04.2015
comment
Может быть, укажите конкретный вариант использования, для которого вы использовали неизвестные поля?   -  person Andriy Drozdyuk    schedule 12.05.2015
comment
Если сообщение protobuf хранится в базе данных и клиенту с более старой версией типа сообщения protobuf необходимо внести изменения, не затирая поля, записанные клиентами с текущей версией protobuf. Одновременное обновление всех клиентов до последней версии сообщения protobuf невозможно. Кроме того, существуют разные типы клиентов, которые имеют разные расписания обновлений, поэтому изменение необходимо координировать между несколькими базами кода.   -  person Joshua    schedule 13.05.2015
comment
Конечно, это немного усложняет разработку релизов, но это определенно возможно. Достаточно сначала выпустить все компоненты со встроенным новым определением прототипа и только в следующем выпуске начать писать новые поля.   -  person siimphh    schedule 30.05.2015
comment
Похоже, теперь это будет официально реализовано: github.com/google/protobuf/issues / 272 # issuecomment-286249933   -  person Joshua    schedule 23.06.2017


Ответы (1)


Избавление от присутствия полей для примитивов делает Protobuf более «естественным» и эффективным для многих языков, поскольку примитивы в C / C ++, Java, C # и Go должны присутствовать. В таких языках, если вам нужна информация о присутствии, вы «упаковываете» примитив, делая его указателем на примитив.

Protobuf 3 избавляется от присутствия примитивов, но сохраняет его для сообщений. Таким образом, вы можете использовать ту же технику «бокса» для Protobuf. В Protobuf теперь есть стандартные сообщения для примитивов.

person Eric Anderson    schedule 04.06.2015