.NET序列化工具Jil、Json.NET和Protobuf的简单测评
前一段时间逛园子的时候发现有人比较了Jil、Json.NET和Protobuf的性能,一时好奇,也做了个测试,这里记录下来,以供查阅。
前期准备
依赖类库的话,可以通过Nuget在公共组件库总下载,这里不做赘述。我在数据库中生成了一些PostInfo数据,取100条进行测试:
[ProtoContract]
public class PostInfo
{
[ProtoMember()]
public long P_ID { get; set; }
[ProtoMember()]
public string P_Title { get; set; }
[ProtoMember()]
public string P_Content { get; set; }
[ProtoMember()]
public string P_CreateTime { get; set; }
}
Jil
Jil是一款高性能的Json序列化工具,大名鼎鼎的StackOverflow也在用它,不少园友说他的性能比Json.NET更快,由于我本身机器环境的原因未能使用最新版,这里使用的是2.6.0版本。
//序列化 JSON.Serialize<List<PostInfo>>(infos); //反序列化 JSON.Deserialize<List<PostInfo>>(jilSerialize);
Json.NET
Json.NET(Newtonsoft.Json)也是一款常用的Json序列化工具,我现在的公司就在使用它,这里使用版本是9.0.1。
//序列化 JsonConvert.SerializeObject(infos); //反序列化 JsonConvert.DeserializeObject<List<PostInfo>>(newtonSerialize);
Protobuf-NET
Protobuf是谷歌出品的数据序列化工具,优点是体积小速度快,但是它并不支持.NET,目前使用的是Java的移植版,而且它的数据格式不能被JS解析,个人认为不太适合作为公共的数据传输规范,目前使用的版本是2.0.0.668,使用起来也比前面两个麻烦,如PostInfo中还要加上ProtoContract和ProtoMember特性。这里顺便提一下,在我使用的过程中发现数据量过大或者使用UTF-8格式对数据进行操作时,Protobuf均会报出异常,可能是我本人使用的问题,也可能是新版本中已经解决的这个问题。
//序列化
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<List<PostInfo>>(ms, infos);
protoSerialize = Encoding.Unicode.GetString(ms.ToArray());
}
//反序列化
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(protoSerialize)))
{
var protobuf_infos = Serializer.Deserialize<List<PostInfo>>(ms);
}
执行结果
序列化时间比较:Protobuf(39ms)>Json.NET(84ms)>Jil(168ms)
反序列化时间比较:Protobuf(6ms)>Json.NET(24ms)>Jil(58ms)
通过执行结果可以看到Protobuf果然是一骑千里绝尘去,甩了其他工具好几条街,可以考虑一下用它来传输和存储日志信息,但Josn.NET的性能和Jil的性能并不如园友们测试的那样Jil的性能要高于Json.NET,我尝试将数据量增加,结果依旧如此,预估有可能跟我引用的版本存在一些关系,但因为环境所限,我也就不折腾了,好了就到这里了。
.NET序列化工具Jil、Json.NET和Protobuf的简单测评的更多相关文章
- Protobuf的简单介绍、使用和分析
Protobuf的简单介绍.使用和分析 一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...
- Google FlatBuffers——开源、跨平台的新一代序列化工具
前段时间刚试用了一个序列化工具cereal,请看cereal:C++实现的开源序列化库,打算再总结下我对google proto buf序列化库的使用呢, 结果还没动手,大Google又出了一个新的. ...
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- jackson、fastjson、kryo、protostuff等序列化工具性能对比
简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...
- spring-data-redis注册fastjson序列化工具
使用spring-data-redis的时候,其序列化工具自带:
- Jackson序列化和反序列化Json数据完整示例
Jackson序列化和反序列化Json数据 Web技术发展的今天,Json和XML已经成为了web数据的事实标准,然而这种格式化的数据手工解析又非常麻烦,软件工程界永远不缺少工具,每当有需求的时候就会 ...
- 各类模块的粗略总结(time,re,os,sys,序列化,pickle,shelve.#!json )
***collections 扩展数据类型*** ***re 正则相关操作 正则 匹配字符串*** ***time 时间相关 三种格式:时间戳,格式化时间(字符串),时间元组(结构化时间).***`` ...
- 网络传输数据序列化工具Protostuff
一直在物色比较好用的网络传输数据序列化工具,看了诸如marshalling,protobuff等,但是均有一个共同特点,使用起来异常繁杂,有没有比较好用同时性能又不会太差的组件呢?答案当然是有的,那就 ...
- 自定义redis序列化工具
redis一个优点就是可以将数据写入到磁盘中. 我们知道写入磁盘的数据实际上都是以字节(0101这样的二进制数据)的形式写入的. 这意味着如果我们要将一个对象写入磁盘,就必须将这个对象序列化. jav ...
随机推荐
- 如何在Hexo中实现自适应响应式相册功能
用最清晰简洁的方法整合一个响应式相册 效果 技术选型 由于我选用的主题使用了fancyBox作为图片弹出展示的框架,查看后表示很不错,能满足需要 http://fancyapps.com/fancyb ...
- Android学习——利用RecyclerView编写聊天界面
1.待会儿会用到RecyclerView,首先在app/build.gradle(注意有两个build.gradle,选择app下的那个)当中添加依赖库,如下: dependencies { comp ...
- js 根据固定位置获取经纬度--腾讯地图
1.首先引入jq 和 腾讯地图js <script src="../js/jQuery.js"></script> <script charset=& ...
- 完整安装sqlserver always on集群
准备工作 1. 四台已安装windows server 2008 r2 系统的虚拟机,配置如下: CPU : 1核 MEMORY : 2GB DISK : 40GB(未分区) NetAdapter ...
- HTML5中新增加Input 的种类
查询文本框 <input type="search"> 数字文本框 any 代表不设置 <input type="number" max=&q ...
- (转)RabbitMQ学习之集群部署
http://blog.csdn.net/zhu_tianwei/article/details/40931971 我们先搭建一个普通集群模式,在这个模式基础上再配置镜像模式实现高可用,Rabbit集 ...
- CSV文件模块的使用
---恢复内容开始--- 1.CSV模块使用流程 1.导入模块 impport CSV 2.打开文件(xxx.csv) with open('xxx.csv','a',encoding='utf-8' ...
- php进程控制
1 POSIX扩展 posix_access($file,$mode) 查看文件的访问权限,可以由is_readable等几个函数代替 posix_errno() 返回posix函数执 ...
- Python笔记6----数组
1.Python 中的数组 形式: 用list和tuple等数据结构表示数组 一维数组:list=[1,2,3,4] 二维数组:list=[[1,2,3],[4,5,6],[7,8,9]] 用arra ...
- MYSQL数据库常用的LINUX命令
此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start / service mysql restart(重启服务) LINUX系 ...