google.protobuf.Any和google.protobuf.Value有什么区别



我想将int/int64/double/foat/uint32/uint64序列化到protobuf中,我应该使用哪一个?哪一种更有效?

例如:

message Test {
google.protobuf.Any   any   = 1;   // solution 1
google.protobuf.Value value = 2;   // solution 2
};
message Test {                         // solution 3
oneof Data {
uint32   int_value    = 1;
double   double_value = 2;
bytes    string_value = 3;
...
};
};

在您的情况下,最好使用oneof

您不能从内置类型打包或解压缩,例如double、int32、int64或google.protobuf.Any。相反,您只能从消息打包或解压缩到消息,即从google::protobuf::Message派生的类。

事实上,google.protobuf.Valueoneof:的包装器

message Value {
// The kind of value.
oneof kind {
// Represents a null value.
NullValue null_value = 1;
// Represents a double value.
double number_value = 2;
// Represents a string value.
string string_value = 3;
// Represents a boolean value.
bool bool_value = 4;
// Represents a structured value.
Struct struct_value = 5;
// Represents a repeated `Value`.
ListValue list_value = 6;
}
}

此外,从google.protobuf.Value的定义中,您可以看到,没有int32、int64或unn64字段,只有一个double字段。IMHO(如果我错了,请纠正我(,如果整数很大,您可能会失去精度。通常,google.protobuf.Valuegoogle.protobuf.Struct一起使用。有关详细信息,请查看google/protobuf/struct.proto

相关内容

最新更新