1.簡單明了介紹ProtocolBuffer
2. ProtocolBuffer(pb)所做事情其實類似於xml、json,也就是把某種數據結構的信息依照某種格式保存起來。主要用於數據存儲、傳輸等。
3. 效率高,支持多種編程語言。
4. 本地搭建環境
首先安裝MAVEN:
下載apache-maven-3.3.3-bin.zip並解壓縮
在環境變量中添加M2_HOME,值為解壓的目錄
在環境變量path中添加%M2_HOME%\bin
輸入mvn –v查看版本驗證安裝成功之后獲取protobuf的jar包
下載protobuf-2.5.0.zip和protoc-2.5.0-win32.zip並解壓(下文中用d:\ protobuf-2.5.0和d:\win32舉例作為解壓目錄)
將d:\win32中的protoc.exe復制到D:\protobuf-2.5.0\src下,打開cmd,在D:\protobuf-2.5.0\java下執行mvn install
在D:\protobuf-2.5.0\java\target下得到protobuf-java-2.5.0.jar文件,導入到項目中。就ok了。
5. 核心文件.proto文件相當於確定數據協議,數據結構中存在了哪些數據,數據類型是什么。
6. 限定修飾符
required 不可增加或刪除的字段,在程序中的build之前必須先初始化,不然會拋異常。
optional 可選字段,可刪除、可以不初始化。
repeated 可重復字段,對應到Java文件里 就是list。
7. 定義.proto文件
message User{
required int32 acctID = 1;
required string passwd = 2;
}
1. message是消息定義的關鍵字,等同於C++中的struct/class,或是Java中的class。
2. LogonReqMessage為消息的名字,等同於結構體名或類名。
3. required前綴表示該字段為必要字段,既在序列化和反序列化之前該字段必須已經被賦值。與此同時,在Protocol Buffer中還存在另外兩個類似的關鍵字,optional和repeated,帶有這兩種限符 的消息字段則沒有required字段這樣的限制。相比於optional,repeated主要用於表示數組字段。具體的使用方式在后面的用例中均會一一列出。
4. int64和string分別表示長整型和字符串型的消息字段,在Protocol Buffer中存在一張類型對照表,既Protocol Buffer中的數據類型與其他編程語言(C++/Java)中所用類型的對照。該對照表中將 給出在不同的數據場景下,哪種類型更為高效。該對照表將在后面給出。
5. acctID和passwd分別表示消息字段名,等同於Java中的域變量名,或是C++中的成員變量名。
6. 標簽數字1和2則表示不同的字段的唯一編號,在序列化后的二進制數據中的布局位置。在該例中,passwd字段編碼后的數據一定位於acctID之后。需要注意的是該值在同一message中不能重復。 另外,對於Protocol Buffer而言,標簽值為1到15的字段在編碼時可以得到優化,既標簽值和類型信息僅占有一個byte,標簽范圍是16到2047的將占有兩個bytes,而Protocol Buffer可以支持字 段數量則為2的29次方減一。有鑒於此,我們在設計消息結構時,可以盡可能考慮讓repeated類型的字段標簽位於1到15之間,這樣便可以有效的節省編碼后的字節數量。
8. 生成Java類
命令:進入protoc.exe 所在的目錄下 執行:protoc.exe --java_out=./ user.proto
9. 在Java中使用
假設在.pro文件中定義一個屬性為 bytes name
Java中可以這樣寫:
String name = “aaaa”;
user.setName(ByteString.copyFromUtf8(name)); 即可。
java中取ByteString的值
假如反序列化后的屬性值為 ByteString類型的,那么可以
通過user.getName().toStingUtf8(); 即可。