簡體   English   中英

帶協議緩沖區的Java序列化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM