Как установить значение по умолчанию для пользовательского типа google protobuf?

У меня есть структура google protobuf:

message ResourceProto{
    optional int32 memory = 0;
    optional int32 core = 1;
}

И у меня есть другая структура:

message AnotherProto{
    optional ResourceProto resource = 0 [default to ResourceProto(100,1)];
    ....
}

Я знаю, как установить значение по умолчанию для нормального типа, такого как int, String, Bool, но как назначить значение по умолчанию для пользовательской структуры, каков синтаксис? Скажем, установить значение по умолчанию resource в AnotherProto на memory = 100 и core = 1?


person hakunami    schedule 15.02.2015    source источник


Ответы (1)


Протокольные буферы не поддерживают значения по умолчанию для полей не примитивных типов. Не уверен, почему именно, но я бы предположил, что это потому, что это редко требуется на практике и сложно реализовать:

  • Произвольные значения по умолчанию довольно сложно самоописать согласованным и переносимым способом. По сути, вам нужно иметь представление о типе any с динамическим типом, который не поддерживается Protobuf2. Вместо этого они представляют значения по умолчанию как необязательно. string default_value с некоторым синтаксисом значений, зависящим от реализации.
  • Когда вы разрешаете это в языке определения, вам нужно ввести синтаксис для структурированных значений по умолчанию. Это немного сложнее, чем поддержка синтаксиса только для примитивных значений.
  • В зависимости от целевого языка может быть не совсем ясно, как обрабатывать такие значения по умолчанию во время выполнения в отношении динамического выделения объектов и владения ими. Самым безопасным вариантом будет копирование, которое может привести к неожиданному снижению производительности.

Тем не менее, в принципе, это можно сделать. Например, я реализовал поддержку произвольных значений по умолчанию в piqi, и это хорошо работает в OCaml и Erlang.

person alavrik    schedule 15.02.2015
comment
Причина, по которой они не поддерживаются, в основном связана со сложностью реализации — сгенерированный код должен был бы создавать постоянные экземпляры этих значений по умолчанию, что сложно, и почти никому не нужна эта функция, поэтому мы этого не делали. . Тем не менее, Cap'n Proto действительно поддерживает значения по умолчанию для агрегатных типов (структур и списков). (Раскрытие информации: я являюсь автором Cap'n Proto, а также большей части кода Protobuf с открытым исходным кодом от Google.) - person Kenton Varda; 16.02.2015
comment
@KentonVarda это все еще верно для protobuf3 и 4? - person Rika; 11.08.2020
comment
@Rika Возможно, но я не работал с protobuf со второй версии, так что не знаю. Также есть proto4 сейчас??? - person Kenton Varda; 12.08.2020
comment
@KentonVarda спасибо, да, на данный момент есть кандидат на выпуск rc2 - person Rika; 12.08.2020