我正在在协议缓冲区中指定一个协议。传输层正在利用Netty的协议缓冲区支持,这意味着Netty的ProtobufDecoder只接受一种类型的MessageLite。
这是最优解吗?我是否可以更好地使用继承,或者其他一些
或者,我应该创建一个全新的OneToOneDecoder,通过某种头部识别消息类型?我可以这样做,但我宁愿不这样做...
谢谢
现在,我想通过此通道发送各种不同的消息类型,每个子类型都与其关联有结构化信息。协议缓冲区并没有继承机制,因此我使用了一种组合方式。我不确定我的做法是否正确。
我的做法是使用枚举对不同的事件进行分类,并使用可选成员封装它们之间的差异。如下是我的.proto
文件,出于清晰起见已经简化:
我的问题在于接收代码需要将EventType.ERROR和ErrorEventDetail进行关联,这感觉有点笨拙。
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;
}
这是最优解吗?我是否可以更好地使用继承,或者其他一些
枚举
的用法?或者,我应该创建一个全新的OneToOneDecoder,通过某种头部识别消息类型?我可以这样做,但我宁愿不这样做...
谢谢