简介

这篇博客主要对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. html的meta总结,html标签中meta属性使用介绍

    引用:http://www.haorooms.com/post/html_meta_ds 前言 meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta ...

  2. 【百度文库课程】Java语言基础与OOP入门学习笔记一

    一. Java的历史与由来 原名Oak,针对嵌入式系统开发设计,语法与C/C++基本一致 二. Java语言特点 Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应 ...

  3. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  4. B样条曲线曲面(附代码)

    1 B样条曲线 1.1 B样条曲线方程 B样条方法具有表示与设计自由型曲线曲面的强大功能,是形状数学描述的主流方法之一,另外B样条方法是目前工业产品几何定义国际标准——有理B样条方法 (NURBS)的 ...

  5. Android layout_weight理解

    layout_weight属性只能用于LinearLayout布局,不能用于RelativeLayout等其他布局: layout_weight属性如果不设定,默认值为0: layout_weight ...

  6. 项 目 管 理 知 识 体 系 指 南 (PMBOK2008)

    项 目 管 理 知 识 体 系 指 南 (第4版) PMBOK2008 输入 工具与技术 输出 4.项目整合管理 4.1 制定项目章程 4.1.1.1 项目工作说明书 4.1.2.1 专家判断 4.1 ...

  7. 微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)

    这篇文章联合软件小编主要介绍了微软源代码管理工具TFS2013安装与使用图文教程,本文详细的给出了TFS2013的安装配置过程.使用教程,需要的朋友可以参考下 最近公司新开发一个项目要用微软的TFS2 ...

  8. SQL Server删除distribution数据库二

    以前总结过一遍博文SQL Server删除distribution数据库,里面介绍了如何删除distribution数据库.今天介绍一个删除distribution的特殊案例, 在这之前,我不知道这个 ...

  9. android 拔打电话功能

    private void phoneCall(String num) { String phoneNum = "tel:" + num; Uri smsToUri = Uri.pa ...

  10. jQuery的deferred对象详解

    jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...