2015-06-01 19 views
5

Sto provando ad inviare dati protobuf da lato cpp a lato java.Come determinare il tipo di messaggio in protobuf in modo che possa usare quel tipo.parsefrom (byte [])

ho più tipi di messaggi definiti nel Proto

Sul lato Cpp, ho enumerazioni per ogni tipo di messaggio e sto aggiungendo che all'uscita buf come segue:

uint8_t* __temp = (uint8_t*)(buf); 
*__temp++ = (type) >> 8; 
*__temp = (type) & 0x00FF; 

Come faccio ottenere questo 'tipo' che ho aggiunto al buf, in modo che io possa ottenere qualcosa come

MessageType parseFrom(byte[] data); 

risposta

12

Non è chiaro quale sia il requisito esatto. Ma suppongo che tu stia cercando di inviare diversi tipi di messaggi e il ricevitore dovrebbe essere in grado di analizzare l'oggetto corretto dai byte ricevuti. Questo può essere fatto come mostrato nell'esempio seguente:

message Message1 { 
    required string a = 1; 
    required string b = 2; 
} 

message Message2 { 
    required int64 id = 1; 
    required string data = 2; 
} 




message WrapperMessage { 
    required int64 commonField = 1; 
    oneof msg { 
     Message1 m1 = 2; 
     Message2 m2 = 3; 
    } 
} 

Fondamentalmente, sempre oggetto WrapperMessage viene inviato attraverso il filo che avvolge un oggetto Message1 o Message2. Quindi sul lato ricevente possiamo prima analizzare l'oggetto WrapperMessage e poi usare il metodo HasField per verificare se i campi m1 o m2 sono presenti nell'oggetto avvolto e quindi analizzare l'oggetto Message1 o Message2 da esso.

La funzione "oneof" potrebbe non essere disponibile nella versione precedente del compilatore protobuf.

+0

Grazie, questo è più o meno quello che sto guardando - sembra anche che io possa farlo in questo modo - https://developers.google.com/protocol-buffers/docs/techniques#union –

+0

@ android.developer Questa documentazione è obsoleta; precede l'introduzione di 'oneof'. Se stai usando protobuf 2.6 o più recente, dovresti assolutamente usare 'oneof'. Ho presentato un bug per le persone protobuf per aggiornare i documenti. https://github.com/google/protobuf/issues/452 –

+0

Grazie, userà 'oneof' quindi –