如何解决google.protobuf.Any 和 google.protobuf.Value 有什么区别?
我想将 int/int64/double/float/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.Value
实际上是 oneof
的包装器:
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 或 unint64 字段,只有一个 double
字段。恕我直言(纠正我,如果我错了),如果整数非常大,你可能会失去精度。通常,google.protobuf.Value
与 google.protobuf.Struct
一起使用。查看 google/protobuf/struct.proto 了解详情。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。