2010-11-01 12 views
5

chcę użyć protobuff w aplikacji Java, aby ułatwić serializacji i mam pytanie o ten cytat ze strony internetowej GoogleJava serializacji z protokołem Buffer

Protocol bufory i OO projekt klas buforowe protokołu są w zasadzie głupi posiadacze danych (np. Structs in C++); nie tworzą oni dobrych obywateli pierwszej klasy w modelu obiektowym. Jeśli chcesz dodać bogatsze zachowanie do klasy generowanej , najlepiej jest zrobić , aby opakować wygenerowaną klasę bufora protokołu w klasie specyficznej dla aplikacji . Pakowanie buforów protokołów jest również dobrym pomysłem , jeśli nie masz kontroli nad projektem pliku .proto w wersji (jeśli, powiedzmy, , ponownie używasz jednego z innego projektu ). W takim przypadku można użyć klasy otoki do jednostek interfejs lepiej dostosowane do unikalnego środowisku aplikacji: ukrywanie pewnych danych i metod, narażając funkcje wygody itd. Należy nigdy dodawać do zachowania wygenerowany klas przez dziedziczenie z nich. Ten złamie wewnętrzne mechanizmy i jest w każdym razie niezbyt dobrą praktyką obiektową .

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

Co to znaczy, gdy mówi do zawijania utworzoną klasę?

+0

zobacz na opakowaniu wzoru projektu, czyli adapterze http://en.wikipedia.org/wiki/Adapter_pattern – none

Odpowiedz

9

Perspective 1

napisać plik .proto i dać go do protoc który generuje kod Builder. Sugerują, aby nie dodawać żadnych metod do wygenerowanego kodu. Jeśli w ogóle chcesz, aby pewne niestandardowe zachowanie zostało dodane do wygenerowanego kodu, NALEŻY ZAPISZ SWOJĄ KLASĘ WŁASNĄ PRZECHOWYWAJĄC wygenerowany kod.

Na przykład powiedzmy, że klasa generowana protokołem to MyMessageBuilder. A chciałeś dodać metodę, która może przyjąć dane wejściowe XML i wypluć komunikat dotyczący protobuffa. Napisałeś XmlToMyMessageBuilder, jak poniżej. Tutaj XmlToMyMessageBuilder, twoja klasa owija wygenerowany kod i dodaje niestandardowe zachowanie zXml().

public class XmlToMyMessageBuilder 
{ 
private final MyMessageBuilder protoBuilder; 

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

Jest to ogólna zasada dobrego programowania.

Perspective 2

Dostarczając pośrednik można również oddzielić kod od bazowego mechanizmu serializacji. Pozwala to na przełączanie implementacji serializera (na przykład chcesz serializować ładunek, w którym wszystkie dane są w formacie łańcuchowym ... gdzie lepsza jest metoda JSON z kompresją) o niskim wpływie. Można zrobić coś takiego

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

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

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

Co to znaczy, gdy mówi do zawijania utworzoną klasę?

Przekazują ci lekcje, zawijają je w klasę dziecięcą stworzoną dla tego, co robisz. Nie współdziałaj z instancją klasy surowej z biblioteki.

+0

@Bill: I object. Odpowiedzi Mistrza Wu były dość wnikliwe i aktualne. (a także zabawne) Podeszli do traktowania programowania jako sztuki zen (tak jak powinno być), zamiast "warzysz kodeki?" to często dzieje się na SO. – abelenky

+2

@abelenky: Wiele osób się nie zgadza. Żadna z odpowiedzi, które usunąłem, nie odpowiedziała na pytanie. Mamy wyższy standard niż tylko "zabawny" tutaj na SO. Gdyby to była tylko jedna lub dwie odpowiedzi, prawdopodobnie poleciałaby, ale to naprawdę nie jest miejsce na konto nowości, które nie służy żadnemu celowi. –

+2

@abelenky: Również, proszę, oznacz flagę "waverts teh codez?" stylowe pytania również o usunięcie. –

3

Oznacza to, że można zaimplementować własną klasę, która zawiera obiekt bufora protokołu jako pole prywatne.

Klasy buforów protokołów są generowane z plików .proto. Te wygenerowane klasy mają wszystkie metody bezpośredniego manipulowania zawartymi w nich polami. Ale nie mają one metod, które obsługują operacje na wyższym poziomie niż tylko modyfikowanie pola.

Twoja klasa otoki może zapewnić bogatszy lub bardziej ograniczony interfejs dla użytkowników Twojego API. Ponieważ każda modyfikacja bufora protokołu musi przejść przez obiekt zawijania, masz pełną kontrolę nad tym, jakie operacje chcesz obsłużyć.

+0

Cóż, generowane wiadomości są niezmienne, więc nie możemy zmienić pól, prawda? –

+0

Chcesz zmodyfikować zawartość, zamiast tego użyj budowniczych. – MForster

Powiązane problemy