Protostuff詳解

chszs發表於2016-01-04
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/50457206

Protostuff詳解

作者:chszs,未經博主允許不得轉載。經許可的轉載需註明作者和部落格主頁:http://blog.csdn.net/chszs

一、Protostuff介紹

Protostuff是一個開源的、基於Java語言的序列化庫,它內建支援向前向後相容(模式演進)和驗證功能。

Protostuff支援的序列化格式包括:

  • protobuf
  • protostuff
  • graph
    即序列化物件圖,即帶迴圈引用的protostuff。詳見:http://www.protostuff.io/documentation/object-graphs/
  • json
  • smile
    即二進位制json,從protostuff-json模組中使用。Smile資料格式是由Jackson JSON庫開發團隊於2010年釋出的資料格式,並在Jackson 1.6版本開始使用此格式。
    Smile格式規範:http://wiki.fasterxml.com/SmileFormatSpec
    與此相似的有BSON格式,見:http://bsonspec.org/
    要注意一點,Smile資料格式和BSON資料格式是互不相容的。比如BSON定義了日期型別,而Smile沒有日期型別。而且,有時候BSON資料格式佔用的空間比原生JSON佔用的空間更多。所以,對於二進位制JSON來說,Smile才是更好的選擇。
    可以參考通用二進位制JSON規範《Universal Binary JSON Specification》:http://ubjson.org/
  • xml
  • yaml
    只支援序列化
  • kvp
    即二進位制的uwsgi頭部(Header),詳見:http://projects.unbit.it/uwsgi

二、Protostuff特徵

1、支援protostuff-compiler產生的訊息

2、支援現有的POJO

3、支援現有的protoc產生的Java訊息

4、與各種移動平臺的互操作能力(Android、Kindle、j2me)

5、支援轉碼

三、Protostuff的模組

1、protostuff-api模組

面向訊息和POJO(message/pojo)的序列化API,內建了對模式演進的支援。
可以與現有物件一起工作,只需新增模式Schema。可以通過程式碼生成、在執行時使用protostuff-runtime生成、或者是手寫產生。

2、protostuff-core模組

繫結了三種二進位制格式:protostuff、graph、protobuf。

protostuff與protobuf的區別:
1)protobuf有一個名為“group”的編碼型別域,而protostuff使用它作為巢狀的訊息。
2)protostuff可以使用尾部界定符來處理訊息流(Stream)。
3)protostuff的一級類在本地格式中支援迴圈引用。

3、protostuff-runtime模組

自動啟用現有的POJO序列化/反序列化為各種格式。
可使用執行時序列化策略,w/c通過系統屬性進行配置。
依賴於protostuff-API和protostuff-collectionschema。

4、protostuff-json模組

面向訊息或POJO的JSON序列化/反序列化。
面向標量域的向前向後相容。
依賴於protostuff-api、jackson-core-asl-1.7.9。如果使用了Smile格式,還需jackson-smile-1.7.9。

5、protostuff-parser模組

使用了ANTLR V3、面向.proto檔案的詞法/語法解析器。
供protostuff-compiler使用。

6、protostuff-compiler模組

面向.proto原始檔的編譯器。
可以從檔案系統、類路徑或從網路HTTP URL中載入.proto原始檔。
可使用引數-Dproto_path=$path告訴編譯器從哪裡載入原始檔。
可擴充套件/定製編譯的輸出。
要編譯原始檔,執行命令:
java -jar protostuff-compiler-1.0.9.jar
protostuff.properties屬性檔案定義:

modules = foo
foo.source = path/to/your/foo.proto
#java_bean, gwt_overlay, java_v2protoc_schema
foo.output = java_bean
foo.outputDir = generated
foo.options = some_key,key:value,another_key

依賴於protostuff-parser模組。

7、protostuff-me模組

對於j2me應用,無需外部依賴
與api模組和core模組結合一起使用,去掉了Java泛型支援。

四、模式Schema

Schema包含:
1)物件進行序列化的邏輯
2)物件進行反序列化的邏輯
3)物件必填欄位的驗證
4)物件欄位名稱到欄位編號的對映
5)物件的例項化

對於現有的物件,必須使用protostuff-runtime來生成Schema——可以通過反射來快取、使用Schema。
開發者更喜歡自定義Schema,比如對必填欄位的驗證等,那麼可以手動編碼。