我在protocol buffers中指定了一个协议。传输层正在利用Netty的 Protocol Buffers 支持——意义在于 Netty 的ProtobufDecoder接受一种,并且只接受一种MessageLite类型。
现在,我想通过这个通道发送各种不同的消息类型,每个子类型都有与之关联的结构化信息。协议缓冲区没有继承机制,所以我使用了一种组合。我不确定我是否以正确的方式去做。
我的方法是用枚举对我的不同事件进行分类,并使用可选成员封装它们的差异。请参阅.proto
下面的内容,为清楚起见,我对其进行了简化。
我的问题是接收代码需要在 EventType.ERROR 和 ErrorEventDetail 之间建立关联。这只是感觉有点笨拙。
简化Events.proto
:
package events;
option java_package = "com.example";
option java_outer_classname = "EventProtocol";
message Event {
enum EventType {
START = 0;
DELEGATE = 1;
ERROR = 2;
STOP = 3;
}
required events.Event.EventType event_type = 1 [default = START];
required int32 id = 2;
required int64 when = 3;
optional StartEventDetail start_event_detail = 4;
optional DelegateEventDetail delegate_event_detail = 5;
optional ErrorEventDetail error_event_detail = 6;
optional StopEventDetail stop_event_detail = 7;
}
message StartEventDetail {
required string object_name = 1;
}
message DelegateEventDetail {
required int32 object_id = 2;
required string task = 3;
}
message ErrorEventDetail {
required string text = 1;
required int32 error_code = 2;
optional Event cause = 3;
}
message StopEventDetail {
required int32 object_id = 2;
}
这是最优的吗?我会更好地以某种方式使用扩展,或者也许其他一些用途enum
?
甚至,我是否应该创建一个全新的OneToOneDecoder可以通过某种标头识别消息类型?我可以这样做,但我宁愿不...
谢谢