我想为双向流的消息建模。在两个方向上,我可以期待不同类型的消息,我不知道什么是更好的做法。目前的两种想法。
message MyMessage {
MessageType type = 1;
string payload = 2;
}
在这种情况下,我会用一个枚举来定义消息的类型 还有一个JSON有效载荷,它将被序列化和反序列化到客户端和服务器端的模型中。第二种方法是。
message MyMessage {
oneof type {
A typeA = 1;
B typeB = 2;
C typeC = 3;
}
}
在第二个例子中,一个oneof被定义为只能设置一个消息类型。双方必须在每种情况下进行切换(A、B、C或None)。
如果你提前知道所有可能的类型,使用 oneof
将是你所描述的方式。
使用协议缓冲区的主要原因是模式定义。通过模式定义,你可以得到类型、代码生成、安全的模式演化、高效的编码等。有了 oneof
方法,您将为您的嵌套有效载荷获得这些好处。
我不建议使用 string payload
因为在实际的有效载荷中使用字符串会消除许多使用协议缓冲区的好处。另外,即使你不需要switch语句来反序列化有效载荷,你也很可能在某些时候需要一个switch语句来使用数据(除非你只是把数据转发到其他系统)。
如果您不提前知道可能的类型,您可以使用的是 Any
类型来嵌入一个任意的协议缓冲区消息到你的消息中。
import "google/protobuf/any.proto";
message MyMessage {
google.protobuf.Any payload = 1;
}
缓冲区的 Any
信息基本上就是你的 string payload
方法,但使用字节而不是字符串。
message Any {
string type_url = 1;
bytes value = 2;
}
使用 Any
相比之下,具有以下优势 string payload
:
Any
类型更多关于 Any
,见。