由于在某些场景中定义灵活的结构对protobuf中的一些人来说是一个小麻烦。
例如:
message Foo {
int a = 1;
repeated int a_other = 2;
}
事实上,我不希望服务的客户端同时传递a
和a_other
。然而,在protobuf中,我们不能将这两个字段放在oneof
中,因为a_other
是一个列表字段。因此,通过声明上面的消息,当我们只传递a_other
字段时,客户端无法判断a
字段实际上是0还是未由服务器传递。
所以我想知道是否为Foo
定义一个字符串字段,比如:
message Foo {
string data = 1;
}
并且服务器端和客户端都同意将CCD_ 8字段视为JSON。因此,服务器转储原始数据,客户端加载原始数据,从此他们过着幸福的生活。
但我的问题是,这样做是一种常见的做法吗?它的缺点是什么?(当然,这样就不用进行类型检查了(或者有更好的方法吗?
oneof
中的重复字段通常由包装消息解决。在您的情况下:
message Foo {
oneof choose_one_a {
int a = 1;
AOtherMessage a_other = 2;
}
}
message AOtherMessage {
repeated int a_other = 1;
}
看来你可以很容易地停下来。
然而,如果你真的发现自己处于";这里我想要任意的JSON";在这种情况下,您可能希望考虑struct.proto
的Value
,而不是普通字符串。Value
可以保存任意的JSON值。如果要保存任意JSON对象(也称为映射(,请改用Struct
。struct.proto
中的类型是protobuf已知的已知类型,当将protobuf消息转换为JSON时,它们以原生JSON形式表示。
message Foo {
google.protobuf.Value a = 1;
}
然而,在";丢弃模式并交换到JSON;您应该参考处理动态内容的不同方法。