一、Protostuff介紹
Protostuff是一個開源的,、基于Java語言的序列化庫,,它內(nèi)建支持向前向后兼容(模式演進)和驗證功能。
Protostuff支持的序列化格式包括:
- protobuf
- protostuff
- graph
即序列化對象圖,,即帶循環(huán)引用的protostuff,。詳見:http://www./documentation/object-graphs/
- json
- smile
即二進制json,從protostuff-json模塊中使用,。Smile數(shù)據(jù)格式是由Jackson JSON庫開發(fā)團隊于2010年發(fā)布的數(shù)據(jù)格式,,并在Jackson 1.6版本開始使用此格式。
Smile格式規(guī)范:http://wiki./SmileFormatSpec
與此相似的有BSON格式,,見:http:///
要注意一點,,Smile數(shù)據(jù)格式和BSON數(shù)據(jù)格式是互不兼容的。比如BSON定義了日期類型,,而Smile沒有日期類型,。而且,有時候BSON數(shù)據(jù)格式占用的空間比原生JSON占用的空間更多,。所以,,對于二進制JSON來說,Smile才是更好的選擇,。
可以參考通用二進制JSON規(guī)范《Universal Binary JSON Specification》:http:///
- xml
- yaml
只支持序列化
- kvp
即二進制的uwsgi頭部(Header),,詳見:http://projects./uwsgi
二,、Protostuff特征
1、支持protostuff-compiler產(chǎn)生的消息
2,、支持現(xiàn)有的POJO
3,、支持現(xiàn)有的protoc產(chǎn)生的Java消息
4、與各種移動平臺的互操作能力(Android,、Kindle,、j2me)
5、支持轉(zhuǎn)碼
三,、Protostuff的模塊
1,、protostuff-api模塊
面向消息和POJO(message/pojo)的序列化API,內(nèi)建了對模式演進的支持,。
可以與現(xiàn)有對象一起工作,,只需添加模式Schema??梢酝ㄟ^代碼生成,、在運行時使用protostuff-runtime生成、或者是手寫產(chǎn)生,。
2,、protostuff-core模塊
綁定了三種二進制格式:protostuff、graph,、protobuf,。
protostuff與protobuf的區(qū)別:
1)protobuf有一個名為“group”的編碼類型域,而protostuff使用它作為嵌套的消息,。
2)protostuff可以使用尾部界定符來處理消息流(Stream),。
3)protostuff的一級類在本地格式中支持循環(huán)引用。
3,、protostuff-runtime模塊
自動啟用現(xiàn)有的POJO序列化/反序列化為各種格式,。
可使用運行時序列化策略,w/c通過系統(tǒng)屬性進行配置,。
依賴于protostuff-API和protostuff-collectionschema,。
4、protostuff-json模塊
面向消息或POJO的JSON序列化/反序列化,。
面向標(biāo)量域的向前向后兼容,。
依賴于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源文件的編譯器,。
可以從文件系統(tǒng)、類路徑或從網(wǎng)絡(luò)HTTP URL中載入.proto源文件,。
可使用參數(shù)-Dproto_path=$path告訴編譯器從哪里載入源文件,。
可擴展/定制編譯的輸出。
要編譯源文件,,執(zhí)行命令:
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應(yīng)用,,無需外部依賴
與api模塊和core模塊結(jié)合一起使用,,去掉了Java泛型支持。
四,、模式Schema
Schema包含:
1)對象進行序列化的邏輯
2)對象進行反序列化的邏輯
3)對象必填字段的驗證
4)對象字段名稱到字段編號的映射
5)對象的實例化
對于現(xiàn)有的對象,,必須使用protostuff-runtime來生成Schema——可以通過反射來緩存、使用Schema,。
開發(fā)者更喜歡自定義Schema,比如對必填字段的驗證等,,那么可以手動編碼,。
|