目录
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 测试环境
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SM4gjNwUzNwIjM1AjNwUTMwIzLcVDMvwlNwUTMwIzLcRWYvxGc19CXt92YuMmYycnLjlGcvw1LcpDc0RHaiojIsJye.png)
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、序列化例子: