[英]Java Serialization with Protocol Buffer
我想在Java應用程序中使用protobuff來促進序列化,我對Google網站上的這句話有疑問
協議緩沖區和OO設計協議緩沖區類基本上是啞數據持有者(如C ++中的結構); 他們沒有在對象模型中成為優秀的一等公民。 如果要為生成的類添加更豐富的行為,最好的方法是將生成的協議緩沖區類包裝在特定於應用程序的類中。 如果您無法控制.proto文件的設計(例如,如果您正在重用另一個項目中的一個),那么包裝協議緩沖區也是一個好主意。 在這種情況下,您可以使用包裝器類來創建更適合應用程序的獨特環境的接口:隱藏一些數據和方法,公開便利功能等。您永遠不應該通過繼承它們來向生成的類添加行為。 這將破壞內部機制,無論如何都不是良好的面向對象實踐。
來自: http : //code.google.com/apis/protocolbuffers/docs/javatutorial.html
它說要包裝創建的類是什么意思?
觀點1
您編寫.proto文件並將其提供給生成Builder代碼的protoc。 他們建議不要在生成的代碼中添加任何方法。 如果你想要將一些自定義行為添加到生成的代碼中,那么寫下你自己的CLASSPING生成的代碼。
例如,讓我們說protoc生成的類是MyMessageBuilder。 並且您想要添加一個方法,該方法可以將XML輸入和spitout特定於protobuff的消息輸出。 你可以編寫一個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;
...
}
這意味着您將實現自己的包含協議緩沖區對象的類作為私有字段。
協議緩沖區類是從.proto文件生成的。 這些生成的類具有直接操作它們包含的字段的所有方法。 但是他們沒有比僅修改字段更高級別操作的方法。
然后,您的包裝器類可以為API用戶提供更豐富或更受限制的界面。 由於協議緩沖區的任何修改都需要通過包裝對象,因此您可以完全控制要支持的操作。
它說要包裝創建的類是什么意思?
他們正在給你上課,把它包裝成為你正在做的事情而建的兒童課。 不要與庫中的原始類實例進行交互。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.