Usando GPB, come faccio a fare in modo che le mie classi wrapper smettano di accettare messaggi binari che non sono pensati per loro?

StackOverflow https://stackoverflow.com/questions/1681263

  •  16-09-2019
  •  | 
  •  

Domanda

sto usando Buffer di protocollo di Google Per serializzare alcuni dei miei oggetti aziendali (in un'app Java). Come raccomandato nei tutorial, avvolgo il costruttore di messaggi in una mia classe che implementa i metodi di Getter e Setter per accedere alle proprietà del messaggio. Inoltre, ho dichiarato tutti i campi di messaggi optional, ancora una volta seguendo le loro raccomandazioni.

Ora, posso dare una qualsiasi delle classi wrapper uno qualsiasi dei messaggi codificati e loro analizzano sempre e li accetteranno. Questo porta a oggetti wrapper che rappresentano un tipo di messaggio che in realtà non contengono e si verificano molti fasulli.

Quando si carica il contenuto binario di un messaggio in una classe wrapper, come posso farne un errore se è stato superato il tipo sbagliato?

La soluzione a cui sto attualmente pensando avrebbe tutti i messaggi estendere un messaggio di base con un campo di tipo richiesto (e forse un campo versione). Ciò avrebbe la classe Builder generata fare un'eccezione se mancano quei campi e, se ci sono, posso controllare il mio codice. Tuttavia, non ho ancora finito di valutare quali ripercussioni questo ha per il mio codice, e non sono sicuro che sarà facile.

È stato utile?

Soluzione 2

Questo sembra essere anche quello che fanno gli altri e funziona bene per me:

message TypedMessage {
    required string type = 1;
    required bytes payload = 2;
}

Il messaggio effettivo entra nel campo del payload in forma serializzata e il tipo viene utilizzato per ottenere la classe Builder e Wrapper corretta. Il campo potrebbe anche essere un enum, attualmente sto usando i nomi delle classi Java, che probabilmente sostituirò con un sistema diverso in seguito, poiché questo significa che il refactoring rompe la compatibilità all'indietro del parser.

Altri suggerimenti

Se i dati che passi a myMessage.parsefrom () non rappresentano un messaggio di quel tipo, otterrai unaprotocolbufferexception. Non è abbastanza per te?

I messaggi PB non si stanno autodescrivendo, quindi devi sapere (con alcuni mezzi) quale messaggio stai cercando di analizzare. Certo, puoi provare a analizzarli e catturare invalidprotocolbufferexception, ma non è molto bello. Invece, penso che la maggior parte delle persone stia usando l'approccio che stai descrivendo: usa una classe di messaggi di base con un campo di tipo (di solito un enum) e un numero di campi opzionali, uno per ogni possibile sottotipo. Ciò consente di analizzare il messaggio e quindi di accendersi il tipo di messaggio per estrarre il "payload" effettivo del messaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top