Podaję protokół w protocol buffers. Warstwa transportowa obsługuje obsługę buforów protokołów od Netty - znaczenie tego polega na tym, że Netty's ProtobufDecoder przyjmuje jeden, i tylko jeden, typ MessageLite.Jak najlepiej określić Protobuf do użycia z Netty (najlepiej przy użyciu wbudowanej obsługi protobuf)
Teraz chcę wysłać różne rodzaje wiadomości na tym kanale, każdy podtyp ma powiązane z nim informacje strukturalne. Bufory protokołów nie mają mechanizmu dziedziczenia, więc używam pewnego rodzaju kompozycji. Nie jestem pewien, czy robię to w prawidłowy sposób.
Moje podejście polegało na kategoryzowaniu moich różnych wydarzeń za pomocą wyliczenia i ujmowania ich różnic za pomocą elementów opcjonalnych. Zobacz poniżej moją .proto
, uprościłem to dla jasności.
Mój problem polega na tym, że kod odbiorczy musi utworzyć powiązanie między atrybutami EventType.ERROR i ErrorEventDetail. To po prostu wydaje się trochę niezgrabne.
uproszczony 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;
}
Jest to optymalna? Czy mógłbym lepiej wykorzystać przedłużenia w jakiś sposób lub być może inne użycie z enum
?
A może nawet powinienem utworzyć całkiem nowy OneToOneDecoder, który może zidentyfikować typ wiadomości według nagłówka? Mógłbym to zrobić, ale Wolałbym nie ...
Dzięki
Dziękuję bardzo, brakowało mi dokumentu o typach Unii. Dobrze wiedzieć, że jestem na dobrej drodze. Pozdrawiam – laher
Naprawdę zmieniłem teraz swoją definicję, w świetle czytania o typach unijnych. Mój typ "Union" nie zawiera już niczego oprócz pola Type plus opcjonalne "podtypy". Wspólne pola ("id" i "when" w moim przykładzie) są teraz przechowywane w wiadomości "EventCommon", która składa się na każdą "podtyp". Teraz każdy "podtyp" zawiera wszystkie niezbędne dane. Wydaje się, że działa lepiej. – laher