Я указываю протокол в буферах протокола. Транспортный уровень использует поддержку буферов протоколов Netty. netty.io/docs/3.2.6.Final/xref/org/jboss/netty/handler/codec/protobuf/ProtobufDecoder.html" rel="noreferrer" title="ProtobufDecoder">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, который может идентифицировать тип сообщения по какому-либо заголовку? Я мог бы сделать это, но я бы не хотел...
Спасибо