在和遠端交互數據時,特別是通信雙方使用的編程語言不一樣,如服務端使用Java而客戶端使用C++等其它編程語言。這就會導致數據流不兼容,出現你不懂我我不懂你的局面,這時候谷歌的谷歌開源項目ProtoBuf就可以解決這個問題,除此之外,用它編寫的協議對老版本協議進行兼容。在這裏給出自己實踐的過程和結果。
實踐環境
- Win7操作系統
- 編程語言Java
- 編程軟件爲IDEA
第一步:編寫.proto文件
這一步不需要過多說了,請參照官方指導1中Defining Your Protocol Forma部分。講一下注意的點:
option java_package = "com.testnetdeve.custom.proto";
option java_outer_classname = "AlarmProto";
如上代碼是自己寫的包名和類名參數
圖中所示是.proto源文件以及編譯後的java文件
解釋
-
option java_package = “com.testnetdeve.custom.proto”, 這一句是編編譯.proto文件後輸出得到的java文件的包名
-
option java_outer_classname = “AlarmProto”,這一句是編編譯.proto文件後輸出得到的java文件的名字,即類名
注意
- 文件的包名最後和你的proto文件所在的項目的文件夾的位置統一,即你想編譯後的java文件在哪個地方,你就把java_package的屬性設爲此。如我想把輸出的java文件放在
com->testnetdeve->custom->proto
,我就把屬性定位com.testnetdeve.custom.proto
,此時生成對應的java文件的包名如圖所示。
java_outer_classname
的參數不能和.proto文件中結構體名一致,否則會報錯。
第二步:編譯.proto文件
- 下載.proto文件的編譯器,傳送門在此。我的操作系統是64bit的,所以下載的是
protoc-3.7.1-win64.zip文件
如圖所示。
- 解壓
protoc-3.7.1-win64.zip
文件後安裝即配置全局環境變量。
- 驗證是否安裝成功
輸入命令protoc --version
,出現版本號即爲成功,如圖所示。
第三步:編譯在第一步中的.proto文件
在命令行中輸入如下代碼:
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
其中SRC_DIR
是源文件夾,DST_DIR
是目的文件夾,因爲我的Java項目文件夾層次太深,不好寫命令。所以我就把.proto文件複製到D:\Java文件夾中,然後運行如下命令:
protoc -I=D:\Java --java_out=D:\Java D:\Java\alarm.proto
在D:\Java文件夾中就會生成以com文件夾爲根文件夾的層次結構,就是第一步中java_package
的屬性值的文件結構。在最後一層的proto文件夾中,你會發現被編譯後生成的AlarmProto.java文件。
第四步:導入ProtoBuf項目的jar包
下載地址在此,請點擊,在你的項目中導入該jar包。當然也可以進行Maven直接導入。
第五步:測試生成的Java文件
測試代碼爲:
package com.testnetdeve.UnitTest;
import com.testnetdeve.custom.proto.AlarmProto;
import org.junit.Test;
public class AlarmProtoTest {
@Test
public void protoTest(){
AlarmProto.Alarm.Builder alarm = AlarmProto.Alarm.newBuilder();
alarm.setCommunity("世紀佳緣");
alarm.setBuildingId(31);
alarm.setCellId(1);
alarm.setRoomId(204);
alarm.setAttachment("此時的時間");
System.out.println(alarm.toString());
}
}
結果爲:
community: "\344\270\226\347\272\252\344\275\263\347\274\230"
building_id: 31
cell_id: 1
room_id: 204
attachment: "\346\255\244\346\227\266\347\232\204\346\227\266\351\227\264"
至此,你就會使用谷歌開源項目ProtoBuf了。
參考文獻