Protocol buffers 如何将默认值设置为自定义的google protobuf类型?

Protocol buffers 如何将默认值设置为自定义的google protobuf类型?,protocol-buffers,default-value,Protocol Buffers,Default Value,我有一个google protobuf结构: message ResourceProto{ optional int32 memory = 0; optional int32 core = 1; } message AnotherProto{ optional ResourceProto resource = 0 [default to ResourceProto(100,1)]; .... } 我还有另一个结构: message ResourceProto{

我有一个google protobuf结构:

message ResourceProto{
    optional int32 memory = 0;
    optional int32 core = 1;
}
message AnotherProto{
    optional ResourceProto resource = 0 [default to ResourceProto(100,1)];
    ....
}
我还有另一个结构:

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

我知道如何将默认值设置为普通类型,如
int
String
Bool
,但如何将默认值分配给自定义结构,语法是什么?比如说,将另一个协议中的
资源
的默认值设置为
内存=100
核心=1

协议缓冲区不支持非原语类型字段的默认值。 不确定确切原因,但我认为这是因为在实践中很少需要它,而且很难实现:

  • 任意默认值很难以一致和可移植的方式自我描述。本质上,您需要有一个动态类型的
    any
    类型的概念,Protobuf2不支持这种类型。相反,它们用一些依赖于实现的值语法表示默认值
  • 如果在定义语言中允许这样做,则需要为结构化默认值引入语法。这比仅支持原语值的语法稍微复杂一些
  • 根据目标语言的不同,可能不太清楚如何在运行时处理动态对象分配和所有权方面的默认值。最安全的选择是复制,这可能会导致意外的性能损失

也就是说,从根本上说,这是可以做到的。例如,我在中实现了对任意默认值的支持,它在OCaml和Erlang中运行良好。

不支持它们的原因主要是因为实现的复杂性——生成的代码必须构造这些默认值的常量实例,这很复杂,实际上几乎没有人想要这个功能,所以我们没有这么做。也就是说,实际上确实支持聚合类型(结构和列表)的默认值。(披露:我是Cap'n Proto的作者,也是谷歌大部分开源Protobuf代码的作者。)@KentonVarda protobuf3和Protobuf4仍然是这样吗?@Rika可能是这样,但我从第2版开始就没有使用过Protobuf,所以我不知道。还有proto4吗?@KentonVarda谢谢,是的,现在有一个发布候选