天天看点

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