简介

这篇博客主要对Xml,Json,Hessian,Protocol Buffers的序列化和反序列化性能进行对比,Xml和Json的基本概念就不说了。
Hessian:Hessian是一个轻量级的remoting onhttp工具,提供了RMI的功能,采用的是二进制RPC协议,内置了序列化功能。
Protocol Buffers:google的一种数据交换的格式,它独立于语言,由于它是一种二进制的格式,比使用 xml 进行数据交换快许多,可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。Google提供了Java、C++、Python的实现,现在网上也已经有了c#等语言的实现。 

序列化和反序列化

XML:使用.Net自带的XmlSerializer。
Json:使用的是ServiceStack.Text,性能高于Newtonsoft.Json,但是速度最快的应该是fastJSON.net。
Hessian:使用的是HessianCSharp库, 从nuget上下载。
Protocol Buffers:使用的是protobuf-net,从nuget上下载。
下列是测试使用的实体。
 [ProtoContract]
public class Student
{
[ProtoMember(, IsRequired = true)]
public int Id { get; set; } [ProtoMember(, IsRequired = true)]
public string Name { get; set; } [ProtoMember(, IsRequired = true)]
public DateTime Time { get; set; } [ProtoMember(, IsRequired = true)]
public List<string> Books { get; set; }
} Student student = new Student()
{
Id = ,
Name = "Alan",
Time = DateTime.Now,
Books = new List<string>() { "语文", "数学" }
};
测试机器使用的i7HQ 2.6HZ处理器。
下面是测试的结果
序列化
反序列化
序列化后字节长度
先说序列化,这里分别用100次,1000次,10000次和100000次进行了测试,纵坐标是完成时间,单位是毫秒,可以看到在进行10000次以内的测试时,4种序列化的耗时都是很小的,都在200毫秒内,10000次以后,到100000次,都开始增长,最差的是Xml,最好的是Protocol Buffers,但是在10000次内的时候,Hessian要优于Protocol Buffers。
对于反序列化10000次内的差别都不大,但是在10000次的时候我们已经可以看出Hessian比较耗时,到了100000次,Hessian直接超过了 Xml,让我一直以为是我的代码出现了问题,表现最好的依然是Protocol Buffers。
序列化后的字节长度,Xml最长这个可以理解,因为文件中包含很多的结尾标签(</Name>),Protocol Buffers依然是最好。
 
根据上面的图,我们几乎可以很快得出结论:Protocol Buffers是最好的,但是我觉得我们还要从以下几个方面综合评估:
1. 可读性:Xml和Json序列化后都是文本,可读性都非常好,比如两个系统要交换数据,如果中间出了差错,我们可以很方便的查看交换的数据,甚至模拟数据去测试;Hessian和Protocol Buffers都是二进制的,序列化后内容都是不可读的,这会对系统的排错造成一定的影响。 
2. 通用性:Xml和Json已经是老牌的数据交换格式了,一般系统之间数据交换也就这两种格式;Hessian和Protocol Buffers都比较冷门,用的比较少。 
3. 便捷性:Hessian其实是一个完整的RPC框架,在服务端定义接口并实现接口,将接口复制到客户端经过少量的编码,我们就可以在像调用本地方法那样去调用服务端,这种实现方式是其他三个工具不具有的,并且性能也不差。

后记

1. 以上的测试结果会因为机器配置的差别而结果略有差别。
2. 使用了单线程的测试, 在多线程下还没有测试。 

Xml,Json,Hessian,Protocol Buffers序列化对比的更多相关文章

  1. Protocol Buffer序列化对比Java序列化.

    初识 Protocol Buff是谷歌推出的一种序列化协议. 而Java序列化协议也是一种协议. 两者的目的是, 将对象序列化成字节数组, 或者说是二进制数据, 那么他们之间有什么差异呢. proto ...

  2. Protocol Buffers序列化原理

    1. 使用Varint编码数据,越小的数据,用少的字节编码.如小于128的用一个字节编码,大于128的用多个字节编码.同时,每个字节最高为1或者0表示是否为数字的一部分. 2. 由于负数的补码表示很大 ...

  3. 使用 Protocol Buffers 代替 JSON 的五个原因

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. Hadoop基础-Protocol Buffers串行化与反串行化

    Hadoop基础-Protocol Buffers串行化与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过很多种序列化文件格式,比如python中的pickl ...

  5. Protocol Buffers 开发者指南

    欢迎来到 protocol buffers 的开发者指南.protocol buffers 是一个语言中立,平台中立针对通讯协议,数据存储和其他领域中对结构化数据进行序列化的扩展方法. 本文档主要针对 ...

  6. Protocol Buffers(1):序列化、编译与使用

    目录 序列化与反序列化 Protocol Buffers概览 Protocol Buffers C++ 编译 Protocol Buffers C++ 使用 Protocol Buffers的可读性 ...

  7. Protocol Buffers与FlatBuffers效率对比

    Protocol Buffers是Google跨语言.跨平台的通用序列化库.FlatBuffers同样出自Google,而且也跨语言跨平台,但更强调效率,专门为游戏开发打造.在游戏界混了几年,各种各样 ...

  8. 使用纳米 Protocol buffers 作为序列化数据

    使用纳米 Protocol buffers 作为序列化数据 Protocol Buffers 是 Google 公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化. 但是它更小, 更快, ...

  9. MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明

    MessagePack, Protocol Buffers和Thrift序列化框架原理和比较说明 http://www.open-open.com/lib/view/open1412731170858 ...

随机推荐

  1. 获取WIFI密码

    在十年前,我还在上初中,班上只有极少数的富二代用得起手机:几年后诺基亚.摩托罗拉.三星手机开始盛行:近些年,安卓.苹果系统手机占据了基本整个市场,WIFI出变得越来越重要. Wifi万能钥匙数据库存储 ...

  2. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  3. 关于reids

    redis 官网(英文):https://redis.io/ redis 手册(中文): http://doc.redisfans.com/ redis 中文网(中文) : http://www.re ...

  4. 如何给不支持新特性的浏览器打补丁(让老版本IE兼容新特性)

    一个非常棒的 JavaScript 框架叫做 Modernizr(http://www.modernizr. com),用于向缺少 HTML5/CSS3特性支持的浏览器打补丁.由 Alexander ...

  5. ORA-01336: specified dictionary file cannot be opened

    这篇介绍使用Logminer时遇到ORA-01336: specified dictionary file cannot be opened错误的各种场景 1:dictionary_location参 ...

  6. javascript-观察者模式

    观察者模式方法   1.称之为消息机制或发布-订阅者模式   2.定义了一种依赖关系解决了主体对象与观察者之间功能的耦合 观察者方法 //将观察者放在闭包中,当页面加载就立即执行 var Observ ...

  7. git 命令使用总结

    聊下 git rebase -i 聊下git merge --squash 聊下git pull --rebase 聊下 git remote prune origin 聊下 git 使用前的一些注意 ...

  8. W3School-CSS 轮廓(Outline)实例

    CSS 轮廓(Outline)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内 ...

  9. Silicon Labs

    Silicon Labs(美国芯科实验室)总部位于美国德克萨斯州的奥斯汀,成立于1996年,拥有全球化的运营.销售和研发团队,是一家业界领先的高性能混合信号IC供应商,为业界提供易用的高度集成化产品方 ...

  10. 深度理解Jquery 中 offset() 方法

    参考原文:深度理解Jquery 中 offset() 方法