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

oyj*_*yjh 7 protocol-buffers protobuf-c

我想将 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;
        ...
   };
};
Run Code Online (Sandbox Code Playgroud)

for*_*ack 6

在你的情况下,你最好使用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;
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,从 的定义中google.protobuf.Value,您可以看到,没有 int32、int64 或 unint64 字段,而只有一个double字段。恕我直言(纠正我,如果我错了),如果整数非常大,您可能会失去精度。通常,google.protobuf.Value与 一起使用google.protobuf.Struct。检查google/protobuf/struct.proto了解详细信息。