C++ protobuffer能否自动填充新创建对象的默认值

C++ protobuffer能否自动填充新创建对象的默认值,c++,protocol-buffers,C++,Protocol Buffers,我在使用google protobuf时遇到问题,我想创建一个具有默认属性值的对象: message Obj { required string id = 1[default=123]; } 序列化上述对象时: string s; Obj obj; obj.SerializeToString(&s); 它抱怨:无法序列化,因为缺少必需的字段id 文档说“默认”值用于从字符串解析obj,而不是序列化为字符串 是否可以使用默认值创建对象?您不能序列化默认值,但可以将其设置为可选字

我在使用google protobuf时遇到问题,我想创建一个具有默认属性值的对象:

message Obj {
    required string id = 1[default=123];
}
序列化上述对象时:

string s;
Obj obj;
obj.SerializeToString(&s);
它抱怨:无法序列化,因为缺少必需的字段id

文档说“默认”值用于从字符串解析obj,而不是序列化为字符串


是否可以使用默认值创建对象?

您不能序列化默认值,但可以将其设置为可选字段。这样,当您反序列化流时,您将得到一个缺少字段的对象,尝试获取该值将为您提供默认值。

否,您无法为内存中的对象设置默认值

默认值仅在反序列化时应用<代码>必填如果字段丢失,则会导致读卡器错误。因此,
required
default
的组合是毫无意义的


如果要设置内存中的默认值,请创建一个工厂函数并使用它。

将字段
设置为可选的
,这样可以避免不必要地传输它吗?链接似乎很复杂。@aj3423 Hum。。抱歉,该链接是为protobuf的C实现提供的。然后我删除我的注释。@shoosh,我不需要从对象中获取值,我需要将其序列化为std::string,在这种情况下,默认值不起作用,似乎我需要编写一个帮助函数CreateObjAndFillDefaultValue()来创建Obj并填充默认值,但是,还有其他想法吗?@aj3423为什么需要这样做?我需要创建一个对象->将其序列化为字符串->发送到服务器。有很多属性(大约30+)都有默认值。对。换句话说:默认值的唯一含义是,当字段未设置时,它是字段的getter返回的值。默认值永远不会在线路上发送。当然,有一个论点认为,在线路上发送默认值是有用的(例如,指定客户端软件版本的
version
字段),但protobuf默认值并不是这样做的。