简介

这篇博客主要对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. 迷你版jQuery——zepto核心源码分析

    前言 zepto号称迷你版jQuery,并且成为移动端dom操作库的首选 事实上zepto很多时候只是借用了jQuery的名气,保持了与其基本一致的API,其内部实现早已面目全非! 艾伦分析了jQue ...

  2. 如何面试前端工程师:GitHub 很重要

    编者注:下面这篇文章从面试官的角度介绍到面试时可能会问到的一些问题. 我在Twitter和Stripe的一部分工作内容是面试前端工程师.其实关于面试你可能很有自己的一套,这里我想跟你们分享一下我常用的 ...

  3. Autodesk正在招聘Civil、Infraworks金牌支持工程师(Premium Support Specialist)

    Civil Infraworks金牌支持工程师,也不知道中文这么翻对不对,反正很牛的,地点优选上海,不过其他地区也没问题啊,感兴趣的,赶紧扔简历过来,我当你内线,帮你内推 :) Autodesk是全球 ...

  4. Android--split()分割字符串特殊用法

    split()分割字符串 1.不同环境下的区分 Java:分割字符串不能写成split("$")//$为要分割的字符Android:分割字符串需要加上中括号split(" ...

  5. iOS开发 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突

    该篇文章摘自我的新浪博客,原文地址为: http://blog.sina.com.cn/s/blog_dcc636350102wavx.html UITableView 拥有属于自己的点击事件,在将一 ...

  6. wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)

    首先说几个最常用的关键字,"eq" 和 "=="等同,可以使用 "and" 表示并且,"or"表示或者."!& ...

  7. HADOOP安装指南-Ubuntu15.10和hadoop2.7.2

    Ubuntu15.10中安装hadoop2.7.2安装手册 太初 目录 1.      Hadoop单点模式... 2 1.1        安装步骤... 2 0.环境和版本... 2 1.在ubu ...

  8. 启动CLR

    前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...

  9. 八爪鱼招标网的百度权重升为2了,独立IP也从0快速发展为1000

      自八爪鱼招标网上线以来,本着以客户一切利益为出发点,坚持提供国内首个免费招标信息平台为目标,经过各位同事不断地努力,不断收集客户各种各样的招标.采购实际需求,与政府.事业单位及中小型企业一对一的沟 ...

  10. Centos6下安装Hadoop2.6 问题总结

    一. 安装背景:VirtualBox下安装三台Centos6.8虚拟机(一主:master, 两从:slave1,slave2) Centos版本:CentOS-6.8-x86_64 网络配置:三台虚 ...