試用Google Protocol Buffers
試用了google Protocol Buffers, 2.0.0 beta 版本,感覺還不錯。
可以去這里下載,有linux和windows版本。
Protocol Buffers是一個平臺中立,編程語言無關的,可擴展的機制,用來將數據序列化。有點類似xml,但是比xml更小更快更簡單。
具體這個文件的語法請參考Protocol Buffer Language Guide
2. 定義后這個文件之后,保存為文件phone.proto。然后使用protocol buffer提供的命令行工具protoc,從這個文件生成制定編程語言的代碼,現在支持Java, C++, 和Python。
如生成java代碼的命令如下:
可以對數據進行序列化,保存到磁盤上。也可以使用Builder方法,從磁盤文件中將原有數據讀出。但是序列化到磁盤中的數據是部分二進制的,不能被人直接讀取。這個不如xml方便。感覺有點像IDL,或者是多語言版的JIBX,或者是單機版的openoffice的UNO。其他PB確實像很多東西,這個頁面列舉了一些。
也許是一些用戶,要制定一個特定的數據結構,進行數據交互和共享。那么使用這個PB Language 定義一個數據結構,然后大家從這個描述文件,各自生成自己使用的編程語言對應的代碼文件,再使用這些代碼對硬盤中的數據進行讀寫。那么,只要都遵守這個數據文件格式,硬盤中的數據共享就實現了夸平臺跨語言了。如果數據描述文件做了修改,只要遵守一定的規則,那么原有數據還是可以兼容使用的。這個就是做了一個平臺無關的文件與平臺和語言相關的數據對象之間的適配轉化工作,就和很多xml解析器一樣,只是這個也許更簡單更易用吧。
2. 定義過程中可以使用類型的概念,可以在使用的時候檢查類型合法性
3. 可以將一個描述文件,生成多種語言的代碼,使數據的讀寫實現了語言無關。
4. 如果描述文件修改了,只要遵守一定的規則,那原有數據結構對應的數據,也是可以被成功讀取的。
2. 不可與xml或者json進行相互轉化
1. 不能加載庫
在ubuntu下安裝,使用如下命令
./configure
make check
make install
安裝之后,運行protoc,提示找不到兩個庫:libprotobuf.so,libprotoc.so。原因是因為這兩個庫安裝在了/usr/local/lib下,但是ubunut的lib路徑為/usr/lib。這個可能是我事先沒有制定-lib目錄。不過anyway,
解決方法:
cd /usr/lib/
sudo ln -s /usr/local/lib/libprotobuf.so.0.0.0 libprotobuf.so.0
sudo ln -s /usr/local/lib/libprotoc.so.0.0.0 libprotoc.so.0
2. 不能正常編譯給出的sample例子(java版本)。
首先進入$protobuf-2.0.0beta/java目錄,運行mvn package,在protobuf-2.0.0beta/java/target目錄下,得到protobuf-java-2.0.0beta.jar文件,這個文件應該放在classpath中,以便在使用protoc生成的java類。但是在sample中,并沒有去將這個jar文件加如classpath中,需要手動加入。否則,運行make java,提示很多類找不到。
解決方法:
方法1.將protobuf-java-2.0.0beta.jar拷貝到系統的classpath下
方法2.將protobuf-java-2.0.0beta.jar中的類完整路徑內容解壓縮到$protobuf-2.0.0beta/examples中。
相關鏈接:
另外一篇關于protocol buffer的文章
可以去這里下載,有linux和windows版本。
Protocol Buffers是一個平臺中立,編程語言無關的,可擴展的機制,用來將數據序列化。有點類似xml,但是比xml更小更快更簡單。
如何使用
1. 使用Protocol特定的簡潔的描述語法,描述一個數據結構,如:message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
2. 定義后這個文件之后,保存為文件phone.proto。然后使用protocol buffer提供的命令行工具protoc,從這個文件生成制定編程語言的代碼,現在支持Java, C++, 和Python。
如生成java代碼的命令如下:
protoc -I=$SRC_DIR --java_out=$DST_DIR phone.proto3. 得到生成java類,就可以進行對上面定義的結構化數據進行操作了。比如,數據結構person中的所有變量,都提供get和set方法。并且提供has方法,檢查這個變量是否存在。
可以對數據進行序列化,保存到磁盤上。也可以使用Builder方法,從磁盤文件中將原有數據讀出。但是序列化到磁盤中的數據是部分二進制的,不能被人直接讀取。這個不如xml方便。感覺有點像IDL,或者是多語言版的JIBX,或者是單機版的openoffice的UNO。其他PB確實像很多東西,這個頁面列舉了一些。
應用場景
一直不是很清楚的知道這個應用場景。也許是一些用戶,要制定一個特定的數據結構,進行數據交互和共享。那么使用這個PB Language 定義一個數據結構,然后大家從這個描述文件,各自生成自己使用的編程語言對應的代碼文件,再使用這些代碼對硬盤中的數據進行讀寫。那么,只要都遵守這個數據文件格式,硬盤中的數據共享就實現了夸平臺跨語言了。如果數據描述文件做了修改,只要遵守一定的規則,那么原有數據還是可以兼容使用的。這個就是做了一個平臺無關的文件與平臺和語言相關的數據對象之間的適配轉化工作,就和很多xml解析器一樣,只是這個也許更簡單更易用吧。
優點
1. 定于語言體積小,支持多種數據類型,如list,支持嵌套2. 定義過程中可以使用類型的概念,可以在使用的時候檢查類型合法性
3. 可以將一個描述文件,生成多種語言的代碼,使數據的讀寫實現了語言無關。
4. 如果描述文件修改了,只要遵守一定的規則,那原有數據結構對應的數據,也是可以被成功讀取的。
缺點
1. 序列化后的文件不可讀。2. 不可與xml或者json進行相互轉化
問題
在使用中發現2個問題1. 不能加載庫
在ubuntu下安裝,使用如下命令
./configure
make check
make install
安裝之后,運行protoc,提示找不到兩個庫:libprotobuf.so,libprotoc.so。原因是因為這兩個庫安裝在了/usr/local/lib下,但是ubunut的lib路徑為/usr/lib。這個可能是我事先沒有制定-lib目錄。不過anyway,
解決方法:
cd /usr/lib/
sudo ln -s /usr/local/lib/libprotobuf.so.0.0.0 libprotobuf.so.0
sudo ln -s /usr/local/lib/libprotoc.so.0.0.0 libprotoc.so.0
2. 不能正常編譯給出的sample例子(java版本)。
首先進入$protobuf-2.0.0beta/java目錄,運行mvn package,在protobuf-2.0.0beta/java/target目錄下,得到protobuf-java-2.0.0beta.jar文件,這個文件應該放在classpath中,以便在使用protoc生成的java類。但是在sample中,并沒有去將這個jar文件加如classpath中,需要手動加入。否則,運行make java,提示很多類找不到。
解決方法:
方法1.將protobuf-java-2.0.0beta.jar拷貝到系統的classpath下
方法2.將protobuf-java-2.0.0beta.jar中的類完整路徑內容解壓縮到$protobuf-2.0.0beta/examples中。
相關鏈接:
另外一篇關于protocol buffer的文章
posted on 2008-07-08 13:56 daning 閱讀(5370) 評論(4) 編輯 收藏 所屬分類: ubuntu 、java