2010-11-01 104 views
5

我想用protobuff在Java應用程序,以方便系列化,我有一個關於從谷歌網站Java序列與協議緩衝區

協議緩衝區和麪向對象設計 協議緩衝區類基本上都是這個報價問題 愚蠢的數據持有者(如結構在 C++);他們不會在一個對象模型中成爲一等公民012xx公民。如果 想要爲生成的類添加更豐富的行爲,那麼執行 的最佳方法是將生成的協議 緩衝區類包裝到 應用程序特定的類中。如果您無法控制.proto文件的 設計(如果您正在重複使用另一個 項目),則協議緩衝區也是個不錯的主意 。在這種情況下,你可以使用 包裝類,以便起草一個 接口更適合於獨特的環境 您的應用程序: 隱藏一些數據和方法,揭露 方便的功能,等等。你應該 絕不添加行爲的產生 繼承自它們的類。這 將打破內部機制,並且是 反正不好的面向對象的練習 。

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

是什麼意思時,它說,包裹創建的類?

+0

看看設計模式包裝,又名適配器http://en.wikipedia.org/wiki/Adapter_pattern – none 2010-11-01 15:42:12

回答

9

視角1

你寫一個.proto文件,並給它protoc產生了Builder代碼。他們建議不要在生成的代碼中添加任何方法。如果您想要將一些自定義行爲添加到生成的代碼中,請寫下您自己的類生成代碼。

例如讓我們說protoc生成的類是MyMessageBuilder。而且你想添加一個方法,它可以接受XML輸入,並將原始特定信息吐出。你會像下面這樣編寫一個XmlToMyMessageBuilder。在這裏XmlToMyMessageBuilder中,你的類正在封裝生成的代碼並從XML()中添加自定義行爲。

public class XmlToMyMessageBuilder 
{ 
private final MyMessageBuilder protoBuilder; 

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

這是一個很好的編程原則。

視角2

通過提供中介還可以從下面的序列化機制解耦你的代碼。這允許你切換序列化器的實現(比如你想序列化一個有效載荷,其中所有的數據都是字符串格式的...... JSON序列化與壓縮是一個更好的選擇),影響很小。你可以做這樣的事情

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

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

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

是什麼意思時,它說,包裹創建的類?

他們交給你一個類,包裝它與一個孩子類的目的,爲你正在做的。不要與庫中的原始類實例進行交互。

+0

@ Bill:我的對象。吳大師的回答都非常有見地和熱門話題。 (以及娛樂性)他們將編程視爲一種禪宗藝術(應該是這樣),而不是「對待編碼?」。這經常發生在SO上。 – abelenky 2010-11-01 20:41:49

+2

@abelenky:很多人不同意。我沒有刪除的答案實際上回答了一個問題。我們有更高的標準,而不僅僅是在這裏的「娛樂」。如果它只是一個或兩個答案,它可能會飛,但這真的不是一個沒有用途的新奇賬戶的地方。 – 2010-11-01 20:51:09

+2

@abelenky:另外,請隨時舉出「wahts teh codez?」以及刪除樣式問題。 – 2010-11-01 20:53:53

3

這意味着您將實現自己的包含協議緩衝區對象的類作爲專用字段。

協議緩衝區類是從.proto文件生成的。這些生成的類具有所有方法來直接操縱它們包含的字段。但是他們沒有比修改字段更高級的操作方法。

您的包裝類可以爲API的用戶提供更豐富或更受限制的接口。由於協議緩衝區的任何修改都需要通過包裝對象,因此您可以完全控制要支持的操作。

+0

那麼生成的消息是不可變的,所以我們不能改變字段,我們可以嗎? – 2011-03-30 14:37:05

+0

您要修改內容,請改爲使用構建器。 – MForster 2011-03-30 15:20:11