2011-12-22 2 views
11

Questo metodo accetta come ultimo argomento un numero intero, ma non sono sicuro di capire cosa lo utilizzerei esattamente.Per che cosa è l'argomento tag protobuf-net SerializeWithLengthPrefix?

Serializer.SerializeWithLengthPrefix(stream, object, PrefixStyle.Base128, [tag]); 

Lo stesso vale per il metodo di deserializzazione corrispondente.

È solo un modo per taggare i messaggi per aggiungere una sorta di funzionalità di "interrogazione" sulla deserializzazione per filtrare i messaggi indesiderati o ha altri usi?

risposta

9

In sostanza, si tratta di un indicatore supplementare che può essere (anche se non ha bisogno di essere) utilizzata per rilevare il "tipo" del messaggio che viene aggiunto, dal momento che la presunzione (quando si utilizza l'approccio *WithLengthPrefix) è che non c'è sono più messaggi nello stesso flusso.

Essendo escluso, significa anche che l'intero flusso composito è un messaggio protobuf assolutamente valida.

modi di usare questo:

  • è possibile serializzare un List<Foo>, e poi ripetutamente deserializzare (con lunghezza prefisso) individuali Foo oggetti, o viceversa
  • con un insieme eterogeneo di oggetti, puoi usare l'API Serializer.NonGeneric per consentire la risoluzione del tipo basata sul tag, cioè il codice equivalente di "se 1 poi fattura, se 2 poi ordina, se 3 poi salta, se 4 poi cliente", ecc - questo è particolarmente utile se si utilizza un dispositivo NetworkStream come dispositivo di invio messaggi. Questo approccio (utilizzando un nome diverso per ogni tipo) consente di leggere gli oggetti fuori dal torrente, e li deserializzare correttamente, senza conoscere in anticipo il tipo del messaggio successivo

E 'possibile omettere questo se si voglio - basta passare zero (IIRC). Ciò salverà (tipicamente) un byte per messaggio aggiunto, ma: significa che lo stream non è più un protobuf valido. Può ancora essere letto, ovviamente, passando zero durante la lettura.

+1

Perché l'inclusione del tag lo rende un messaggio protobuf valido? Non puoi deserializzare singoli elementi in una lista senza il tag? – Simone

+0

Inoltre, la risoluzione del tipo tramite tag deve essere eseguita dal codice dell'applicazione, giusto? – Simone

+1

@Simone rende il messaggio * composite * un protobuf valido, perché 'MessageType ripetuto' (in .proto) è codificato come una sequenza di" [tag] [lunghezza] [carico utile] ... [tag] [lunghezza] [ carico utile]". Quindi con il tag è un protobuf valido, e senza: non lo è. Re tipo di risoluzione; normalmente sì, poiché è intenzionalmente indipendente dalla piattaforma; tuttavia, protobuf-net include anche un supporto * aggiuntivo * per includere alcune informazioni di tipo limitato sul filo. –