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

What the difference between google.protobuf.Any and 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

您不能从内置类型打包或解包到内置类型,例如双精度,int32,int64,到 google.protobuf.Any。相反,您只能从消息中打包或解包消息,即从 google::protobuf::Message.

派生的 class

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.Valuegoogle.protobuf.Struct 一起使用。检查 google/protobuf/struct.proto 了解详情。