2015-02-15 4 views
2

У меня есть структура Protobuf Google:Как установить значение по умолчанию для настроенного типа goob 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?

ответ

2

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

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

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

+1

Причина, по которой они не поддерживаются, объясняется главным образом сложностью реализации - сгенерированный код должен был бы создавать постоянные экземпляры этих значений по умолчанию, что сложно, и почти никто на самом деле не хочет эту функцию, сделайте это. Тем не менее, [Cap'n Proto] (https://capnproto.org) фактически поддерживает значения по умолчанию для совокупных типов (структуры и списки). (Раскрытие информации: Я являюсь автором Cap'n Proto, а также большей части кода Protobuf с открытым исходным кодом от Google.) –