2010-11-01 23 views
5

voglio usare protobuff in un'applicazione Java per facilitare la serializzazione e ho una domanda circa questa citazione dal sito web di GoogleJava serializzazione con protocollo Buffer

buffer protocollo e OO design protocollo classi tampone sono fondamentalmente titolari di dati stupidi (come le strutture in C++); non rendono i cittadini di prima classe cittadini in un modello a oggetti. Se si si desidera aggiungere un comportamento più ricco a una classe generata da , il modo migliore per fare consiste nel racchiudere la classe di buffer del protocollo generato in una classe specifica dell'applicazione . Il wrapping dei buffer di protocollo è anche una buona idea se non si ha il controllo sul progetto del file .proto (se, per esempio, si sta riutilizzando uno da un altro progetto ). In tal caso, è possibile utilizzare la classe wrapper alle imbarcazioni un'interfaccia più adatto al unica ambiente della vostra applicazione: nascondere alcuni dati e metodi, esponendo funzioni comfort, ecc Si dovrebbe mai aggiungere un comportamento al generata classi ereditando da loro. Questo interromperà i meccanismi interni ed è non buono pratica orientata agli oggetti comunque.

da: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

Che cosa significa quando si dice per avvolgere la classe creata?

+0

guardare il pattern pattern wrapper, aka adapter http://en.wikipedia.org/wiki/Adapter_pattern – none

risposta

9

Prospettiva 1

si scrive un file Proto e dare a ProtoC che genera il codice Builder. Stanno suggerendo di non aggiungere alcun metodo al codice generato. Se non si desidera alcun comportamento personalizzato da aggiungere al codice generato, WRITE YOUR OWN CLASS WRAPPING il codice generato.

Per esempio, diciamo che la classe generata da protoc è MyMessageBuilder. E volevi aggiungere un metodo che potesse prendere input XML e sputare il messaggio specifico di protobuff. Dovresti scrivere un XmlToMyMessageBuilder come di seguito. Qui XmlToMyMessageBuilder, la classe sta eseguendo il wrapping del codice generato e aggiungendo il comportamento personalizzato da XML().

public class XmlToMyMessageBuilder 
{ 
private final MyMessageBuilder protoBuilder; 

public MyMessage fromXml(byte[] input() 
{ 
protoBuilder.setXXX(); 
} 
} 

Questo è un principio di programmazione generale.

Prospettiva 2

Fornendo un intermediario si può anche disaccoppiare il codice dal meccanismo di serializzazione sottostante. Ciò consente di cambiare le implementazioni del serializzatore (ad esempio, si desidera serializzare un payload in cui tutti i dati sono in formato stringa ... dove la serializzazione JSON con compressione è un'alternativa migliore) a basso impatto. Si potrebbe fare qualcosa di simile

public interface MySerializer 
{ 
boolean serialize(MyDomainObject input); 
} 

public PBBasedSerializer implements MySerializer 
{ 
private final MyMessageBuilder protoBuilder; 
... 
} 

public JsonBasedSerializer implements MySerializer 
{ 
private final JSONSerializer jsonSerializer; 
... 
} 
-1

Che cosa significa quando si dice di avvolgere la classe creata?

Ti stanno consegnando una lezione, avvolgila con uno scopo di classe per bambini costruito per quello che stai facendo. Non interagire con un'istanza di classe grezza dalla libreria.

+0

@Bill: I object. Le risposte del Maestro Wu erano in realtà piuttosto perspicaci e attuali. (oltre che divertente) Si sono avvicinati al trattamento della programmazione come arte zen (come dovrebbe essere), piuttosto che "wahts teh codez?" che spesso accade su SO. – abelenky

+2

@abelenky: molte persone non sono d'accordo. Nessuna delle risposte che ho cancellato in realtà ha risposto a una domanda. Abbiamo uno standard più elevato di "intrattenere" qui su SO. Se fosse stata solo una o due risposte probabilmente sarebbe volato, ma questo non è il posto giusto per un account di novità che non serve a nulla. –

+2

@abelenky: Inoltre, non esitate a contrassegnare "wahts teh codez?" domande di stile per la cancellazione. –

3

Significa che si implementerà la propria classe che contiene un oggetto buffer di protocollo come campo privato.

Le classi del protocollo buffer vengono generate dai file .proto. Queste classi generate hanno tutti i metodi per manipolare direttamente i campi che contengono. Ma non hanno metodi che servono operazioni di livello superiore rispetto alla semplice modifica di un campo.

La classe wrapper può quindi fornire un'interfaccia più ricca o più limitata agli utenti dell'API. Poiché qualsiasi modifica del buffer del protocollo deve passare attraverso l'oggetto wrapping, si ha il pieno controllo su quali operazioni si desidera supportare.

+0

Bene, i messaggi generati sono immutabili, quindi non possiamo cambiare i campi, possiamo? –

+0

Si desidera modificare i contenuti, utilizzare invece i builder. – MForster