Sto specificando un protocollo in protocol buffers. Il livello di trasporto sta sfruttando il supporto del protocollo di buffer del protocollo Netty, il cui significato è che il numero ProtobufDecoder di Netty accetta uno e solo uno tipo di MessageLite.Il modo migliore per specificare un Protobuf da usare con Netty (preferibilmente usando il supporto protobuf incorporato)
Ora, voglio inviare una varietà di tipi di messaggi diversi su questo canale, ciascun sottotipo con informazioni strutturate ad esso associate. I buffer di protocollo non hanno un meccanismo di ereditarietà, quindi sto usando un tipo di composizione. Non sono sicuro se sto andando su di esso nel modo corretto.
Il mio approccio è stato quello di classificare i miei diversi eventi con un enum e incapsulare le loro differenze utilizzando membri opzionali. Vedere il mio .proto
qui sotto, l'ho semplificato per motivi di chiarezza.
Il mio problema qui è che il codice ricevente deve creare l'associazione tra EventType.ERROR e ErrorEventDetail. Questo mi sembra un po 'goffo.
semplificato 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;
}
È questo ottimale? Sarebbe meglio usare extends in qualche modo, o forse qualche altro uso di enum
?
O anche, dovrei creare un intero nuovo OneToOneDecoder che può identificare un tipo di messaggio da qualche tipo di intestazione? Potrei farlo, ma Preferirei di no ...
Grazie
grazie mille, ho perso il documento sui Tipi Unione. Buono a sapersi, sono sulla strada giusta. Cheers – laher
In realtà ho cambiato la mia definizione ora, alla luce della lettura di Union Types. Il mio tipo 'Unione' non contiene più nulla tranne il campo Tipo più i 'sottotipi' opzionali. I campi comuni ('id' e 'when' nel mio esempio) sono ora mantenuti in un messaggio 'EventCommon', che è composto in ogni 'sottotipo'. Quindi, ora ogni 'sottotipo' contiene tutti i dati necessari. Questo sembra funzionare meglio. – laher