天天看點

java序列化/反序列化之xml、protobuf、protostuff 的比較與使用例子

目錄

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 測試環境

java序列化/反序列化之xml、protobuf、protostuff 的比較與使用例子

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:

java序列化/反序列化之xml、protobuf、protostuff 的比較與使用例子
java序列化/反序列化之xml、protobuf、protostuff 的比較與使用例子

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

java序列化/反序列化之xml、protobuf、protostuff 的比較與使用例子

假如.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、序列化例子: