如何将默认值设置为自定义谷歌protobuf类型?

时间:2015-02-15 14:34:09

标签: protocol-buffers default-value

我有一个谷歌protobuf结构:

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

我有另一种结构:

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

我知道如何将默认值设置为普通类型,如intStringBool,但如何将默认值分配给自定义结构,语法是什么?比方说,将resource中的AnotherProto的默认值设置为memory = 100core = 1

1 个答案:

答案 0 :(得分:2)

协议缓冲区不支持非基本类型字段的默认值。 不确定为什么到底,但我认为这是因为它在实践中很少需要并且难以实现:

  • 任意默认值很难以一致且可移植的方式自我描述。基本上你需要有一个动态类型any类型的概念,Protobuf2不支持它。相反,它们将默认值表示为optional string default_value,并为值提供了一些依赖于实现的语法。
  • 在定义语言中允许此操作时,需要引入结构化默认值的语法。这比仅支持原始值的语法稍微复杂一些。
  • 根据目标语言,可能不太清楚如何在运行时处理有关动态对象分配和所有权的此类默认值。最安全的选择是涉及复制,这可能会导致意外的性能损失。

那说,从根本上说,可以完成。例如,我已经在piqi中实现了对任意默认值的支持,并且它在OCaml和Erlang中运行良好。