简介

这篇博客主要对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. div盒子垂直水平居中

    div盒子,水平垂直居中. <!DOCTYPE html><html> <head> <meta charset="utf-8"> ...

  2. 原生js使用forEach()与jquery使用each遍历数组,return false 的区别

    原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24]; $.e ...

  3. 时间戳转化为日期TimeStamp转NSDate转NSString

    //时间戳处理 NSInteger time = [self.album.updatedAt integerValue] / 1000; NSNumber *timer = [NSNumber num ...

  4. React Native知识1-FlexBox 布局内容

    一:理论知识点 1:什么是FlexBox布局? 弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其 ...

  5. android handler传递消息机制

    当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...

  6. [css]我要用css画幅画(六)

    接着之前的[css]我要用css画幅画(五), 由于这个画已经画了很久了,这次一次性加了比较多更新,算是让这幅画告一段落吧. 本次的更新包括: 1. 给云增加动画 2. 画了一棵树 3. 树上画了一个 ...

  7. IRIS数据集的分析-数据挖掘和python入门-零门槛

    所有内容都在python源码和注释里,可运行! ########################### #说明: # 撰写本文的原因是,笔者在研究博文“http://python.jobbole.co ...

  8. MySQL优化概述

    一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...

  9. [原创]kali linux下破解wifi密码以及局域网渗透

    无线破解是进行无线渗透的第一步.破解无线目前只有两种方法:抓包.跑pin. 破解无线方法一:抓包.我是在kali linux下进行的. 将无线网卡的模式调为监听模式. airmon-ng start ...

  10. [百度经验]window下连接mysql 错误代码 1045

    连接mysql时出现错误代码 1045 Access denied for user 'root'@'localhost' (using password:YES) 百度经验:jingyan.baid ...