Protocol buffers 快速入門(針對 Java 語言) 原 薦

寫在前面

        在學習使用 protocol buffers 的時候一開始在網上找一些博客看,遇到的問題是很多博客寫的並不清晰看了也是讓人一頭霧水,沒法達到對 protocol buffers 快速上手使用的目的(完成一個 hello world)。然後通過官方文檔學習後對 protocol buffers 有了大概的認識,也達到能夠應用的程度。建議最好還是去看官網上的文檔,描述的很詳細。protocol buffers 官網(請科學上網)

 

Protocol Buffers 是什麼?

        Protocol Buffers 簡稱 protobuf , 由 google 開源。是一中語言中立 , 平臺中立 ,(不和特定的語言、操作系統綁定),對結構化數據進行序列化、反序列化的機制。類似於 XML , 比起 XML protobuf 的優點是 :數據佔用空間小 , 傳輸速度快  ,使用起來簡單 , 定義一次數據結構,生成指定語言的代碼 (目前支持Java 、Python 、C++ 、Objective-C 、Go 、Ruby 、C# 、JavaScript 、PHP 、Dart )。 缺點是可讀性不如 XML 。protobuf 不是好的面向對象的設計 , 不能發揮面向對象的特性 , 不應該通過繼承向生成的類添加行爲, 這會打破內部機制,無論如何都不是很好的面向對象的實踐。

 

開始使用 brotobuf

1.     下載並安裝 protobuf compiler  (用 C++ 編寫),作用是根據定義的 .proto 文件生成指定語言的代碼。

        這一步有兩種方式 :

                1.  使用源碼自己去編譯、安裝 (對使用 C++ 的同學來說很簡單)。

                2.  下載已經編譯好的可以直接執行的二進制文件 (對使用非 C++ 的同學來說很方便 ,下載後最好配置到環境變量中)。

2.    根據所使用的語言下載 protobuf 對應的運行時包 , 比如我使用的是 java 語言 , 那麼我需要將 protobuf-java (maven 中可以找到) 這個包添加到我的工程內。 

    第 1 步是和開發環境有關 , 使用 protobuf compiler 生成代碼 ,將生成的代碼放在自己的應用中。

    第 2 步是和運行時有關 , 要在自己的應用中添加 protobuf 對應語言的包。

3.    編寫 .proto 文件 ,在 .proto 文件中定義數據結構 , .proto 有定義好的語法規則  。 (我使用的 IDE 是 IDEA , 在 IDEA 中安裝了 Protobuf Support 插件 , 可以提供一些諸如語法檢查的幫助)。

4.     根據指定的 .proto 文件生成代碼 , 這裏我生成的是 Java 代碼 , 例子 :

cat.proto 文件內容 

syntax = "proto2";

package tutorial;

option java_package = "net.j4love.protobuf.demo";
option java_outer_classname = "CatProto";

message Cat {
    required int32 id = 1;
    required string name = 2;
    required string color = 3;
}

 

protoPath : .proto 文件所在路徑;

codeDestPath : 生成的 java 代碼目標路徑

protoFilePath : 具體的某個 .proto 文件所在路徑

protobuf compiler 命令生成代碼 : protoc -I=$protoPath  --java_out=$codeDestPath  $protoFilePath   (protoFilePath   可以同時指定多個,之間用空格隔開)

例子 : 

protoc -I=E:/Develop/hepeng/protobuf-demo/src/main/java/net/j4love/protobuf/proto --java_out=E:/Develop/hepeng/protobuf-demo/src/main/java E:/Develop/hepeng/protobuf-demo/src/main/java/net/j4love/protobuf/proto/cat.proto

 

使用 Java 代碼的生成方式例子 :


// protobufCompilerPath 是安裝的 protobuf compiler 中 protoc.exe 的絕對路徑 
// 例如 :D:/DevelopmentTools/protobuf compiler/bin/protoc.exe
public static void generateJavaCode(String protobufCompilerPath , String protoPath ,
                                       String codeDestPath , String ... protoFilePaths) {
        String protobufCmd = protobufCompilerPath + " -I=" + protoPath + " --java_out=" + codeDestPath + " ";
        for (String protoFilePath : protoFilePaths) {
            protobufCmd += " " + protoFilePath;
        }
        System.out.println("protobuf Generate Code Command : " + protobufCmd);
        try {
            Runtime.getRuntime().exec(protobufCmd);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

        經過這 4 步就可以完成一個 protobuf 的 hello world 了 , 其他詳細內容還是建議看官方的文檔。我編寫的 protobuf-demo 代碼地址

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章