目錄
1、背景
2、測試
2.1、環境
2.2、工具
2.3、說明
2.4、結果
2.5、結論
3、xml簡單教程
3.1、準備
3.2、代碼
4、protobuf簡單教程
4.1、快速入門
1、下載下傳.exe編譯器
2、編寫.proto檔案
3、利用編譯器編譯.proto檔案生成javabean
4、引用jar包
5、直接使用javabean自帶的序列化、反序列化、提取屬性等方法
5、protostuff簡單教程
5.1、快速入門
1、引用jar包
2、直接使用相關序列化、反序列化文法
6、protobuf與protostuff差別
protostuff是一個基于protobuf實作的序列化方法,它較于protobuf最明顯的好處是,在幾乎不損耗性能的情況下做到了不用我們寫.proto檔案來實作序列化。
我今天要将的是google開發的開源的序列化方案protocol buffer(簡稱protobuf),它的好處很多,獨立于語言,獨立于平台,最最重要的是它的效率相當高,用protobuf序列化後的大小是json的10分之一,xml格式的20分之一,是二進制序列化的10分之一。
2.1 測試環境
xstraem版本:1.3.1
protobuf-java版本:3.0.0-alpha-2
java版本:1.7
-xms2048m
-xmx2048m
2.2 測試工具
用時: 控制台輸出時間
cpu&記憶體: jconsole
檔案大小: 檔案屬性
2.3 說明
測試中,xml和protobuf和protostuff三種測試所使用的javabean所擁有的字段類型相同、字段數量相同(約28個)、字段所附的值相同、都包含有一個list<string>字段,用list字段的size來控制javabean對象的大小。本次測試中size=100
2.4 結果
測試a:10000個對象
xml
protobuf
protostuff
序列化
用時(ms)
2399
648
261
占用的cpu(%)
24.2
12.3
3.4
占用的記憶體(m)
154
235
92
每個檔案大小(byte)
2822
574
反序列化
3378
167
224
占用cpu(%)
15.9
14.2
6.1
占用記憶體(m)
248
307
164
備注:10000個對象
測試b:25000個對象
4161
767
293
31.2
14.6
4.7
495
228
194
6941
252
393
31.9
21.9
8.1
411
382
348
備注:25000個對象
測試c:100000個對象
12867
3070
704
42.5
44.9
22.3
1098
1058
572
24442
4540
1522
38.8
68.2
24.1
2215
597
870
備注:50000個對象
2.5 結論
1、序列化:
1.1、速度上:protostuff比protobuf快3倍左右,protobuf比xml快4-5倍,該倍數随着序列化對象的增加,基本保持不變。
1.2、cpu上:protostuff占用最少,protobuf其次,xml最後。
1.3、記憶體上:protostuff占用最少,protobuf其次,xml最後。
1.4、生成檔案大小:protostuff占用最少,protobuf其次,xml最後,前面兩者是後者的1/4左右。
2、反序列化
2.1、速度上:在反序列化對象數量較少的情況下,protobuf比protostuff快1/4左右,比xml快10+倍。但随着對象數量的增加,protobuf發生了速率明顯變慢的情況!進而被protostuff趕超。
2.2、cpu上:protostuff占用最少,protobuf其次,xml最後。
2.3、記憶體上:protostuff占用最少,protobuf其次,xml最後。
3、總結
在各個方面上,protostuff的優勢非常面試,而protobuf也不弱,考慮用來代替xml。
3.1 準備
jar包:pom.xml:
3.2 代碼
1、java bean:
view code
2、序列化:
然而,一般來說,對xstream的序列化和反序列化,要自己實作converter接口來轉化的,這樣的解決一個問題,就是對方接口的字段和我們自己的javabean的字段名不一緻的問題。這裡不多說,可以搜尋xstrem converter,即有大量文章。
4.1、快速入門:
下載下傳.exe編譯器——編寫.proto檔案——利用編譯器編譯.proto檔案生成javabean——引用jar包——直接使用javabean自帶的序列化、反序列化方法
1、下載下傳針對java的.exe編譯器
protobuf編譯器官方下載下傳位址:https://developers.google.com/protocol-buffers/docs/downloads
下載下傳不了的:點我
2、編寫.proto檔案,如下products.proto檔案
其中的option java_package代表将要生成的javabean所有的包的包名
其中的option java_outer_classname代表要生成的javabean的類名
其中的message products22可以了解為一個類似c語言的結構體,在生成的javabean中将變成一個内部類,一個.proto檔案可以有無數個message
proto支援的類型與修飾符可參考該部落格:http://blog.sina.com.cn/s/blog_abea023b0101dxce.html
3、利用編譯器編譯.proto檔案生成javabean
把.proto檔案放在.exe同個目錄下面,打開cmd,進入同目錄下,執行指令:
protoc.exe --java_out=./ products.proto
假如.proto檔案沒有編寫錯誤的話,成功後在同目錄下即有javabean的類生成。
4、引用jar包
jar包位址pom.xml:
5、把剛剛生成的javabean複制到項目中,這裡直接使用javabean自帶的序列化、反序列化方法
剛剛生成的javabean為:products2
序列化例子:
builder對象由來:com.dxz.products2.products22.builder,即可有生成的javabean點出來。
反序列化例子:
拿出具體字段例子:
5.1 快速入門
引用jar包——學習文法——直接使用
1、引用jar包:
pom.xml:
2、javabean:
同上面xml的javabean
3、序列化例子: