2019年9月3日

Swifter.Json 可能是 .Net 平台迄今为止性能最佳的 Json 序列化库【开源】

Json 简介
Json (JavaScript Object Notation) 是一种轻量级的数据交换格式。它作为目前最欢迎的数据交换格式,也是各大开源贡献者的必争之地,如:阿里爸爸的 fastjson(java),腾讯的 rapidjson(c++) 等。但 .Net 却没有得到大厂的青睐,在 Swifter.Json 之前 .Net 的 Json 解析库都不完美。
 
 
Swifter.Json 简介
Swifter.Json 是 .Net 平台上一个功能强大,简单易用,稳定及高性能的 Json 序列化和反序列化工具。
 
Swifter.Json 强大之处
1:支持 .Net 已知所有对象结构,包括深度循环结构,引用类型属性等。
2:支持几乎所有常用的数据类型,并多方案轻松自定义类型的序列化行为,后续将持续增加。
3:支持缩进 Json,忽略 Null 值 0 值 "" 值等,支持使用 { "$Ref" : "#/Target" } 表示重复引用,或将循环引用序列化为 Null 等,支持设置最大深度。
4:支持 .Net Core 2.0+,.Net Framework 2.0+,.Net Standard 2.0+,Xamarin,Unify,Mono 等平台。
5:Swifter.Json 几乎是无 BUG 的,因为它已有多个上线项目在运行,且每次发布都会经过我们自己单元测试和 Newtonsoft.Json 和 Spanjson 的单元测试来确保它的稳定性,如果您遇到了问题,可以在 Github 上发布一个 issue,我们会尽力帮助您。
6:完整全面的 API 中文文档,每个公开的类型和方法都有中文说明,也有 Github 上的 Wiki 文档 (现主要维护文档)。
 
为什么要重复造轮子?
目前 .Net 平台上的 Json 库都存在一些明显的缺点:一些虽然简单易用,但是性能不高,一些性能高却不稳定,稳定的有性能低且过于复杂。
我们迫切需要一个强大,稳定,高性能且易于使用的 Json 序列化工具!
所以 Swifter.Json 被制作出来了。
 
Swifter.Json 的库引用
Swifter.Core:这是一个工具包,它可以为类库开发者提供巨大的帮助,Swifter.Json 基于它。它提供了高效的数据读写 API,高效的数学算法以及 .Net CLR 无数据信息,以及解决各平台版本之间的差异问题等,后期我们将基于这个库开发一个 Swifter.MessagePack (已开发好,待发布)。这个库 300~400KB 之间(各平台有差异)。
Swifter.Unsafe:这是一个 IL 代码编写的库,因为提供的操作与 System.Runtime.ComplierServices.Unsafe 提供的功能类似,所以取名叫 Swifter.Unsafe,这个库大慨 5KB。
Swifter.Json:实现 Swifter.Json 的 IValueReader, IValueWriter 即实现了对任意对象执行序列化和反序列化,主要的代码在 JsonSerializer (实现 IValueWriter) 和 JsonDeserializer (实现 IValueReader)中,JsonFormatter 提供 API重载,现在已支持全异步 API。这个库大概 86KB。
 
Swifter.Json 的性能
.Net Core 3.0 Preview 7 的测试结果
相比 Newtonsoft.Json 提高了 5 到 10 倍左右,虽然目前已有许多 Json 库号称高性能,但实际上我认可的除Swifter.Json只有 Spanjson,但它缺点太明显,仅支持 .Net Core 2.1+ 且稳定性不好。如果您不愿意使用 Swifter.Json,那本人建议您使用 Newtonsoft.Json,毕竟它除了性能之外全是优点。
还有一个与性能密切相关一个特性:小分配。顾名思义就是分配的内存大小,举例:当程序在执行反序列化数组操作时,因为对数组长度未知,所以多数 Json 工具都在这个过程中反复的创建更大的数组,这个过程相当耗时且耗资源。Swifter.Json 已使用池技术完美解决这个问题。Spanjson 也使用 Core 上的 ArrayPool 池解决,所以我为 Spanjson 点了小星星。
 
简单使用
 
 
更多使用方法和文档请上 Github 查看 Wiki。
 
最后附上一张我们对 .Net 平台已有的 Json 库一个简单的评价

posted @ 2019-09-03 08:13 刑天 阅读(318) 评论(0) 推荐(0) 编辑

2018年12月5日

傅盛:如何用沟通解决80%的工作问题?

摘要: 来源:傅盛(ID:fstalk) 我曾经说过,工作中80%的问题都是沟通造成的。绝大部分工作问题,不来自于技能本身,而来自于沟通。 沟通的本质,不是你说了什么,而是别人听懂了什么。但问题是,你怎么确认对方听懂了?沟通真的太难了。 后来,我慢慢发现,沟通之难,主要源于几个客观存在的基本事实: — 1  阅读全文

posted @ 2018-12-05 08:06 刑天 阅读(244) 评论(0) 推荐(0) 编辑

2015年12月28日

ASP.NET请求管道、应用程序生命周期、整体运行机制

摘要: 我们知道在ASP.NET中,若要对ASP.NET应用程序进行 初始化并使它处理请求,必须执行一些处理步骤,熟悉应用程序生命周期非常重要,这样才能在适当的生命周期阶段编写代码,达到预期的效果。永远不要做只会拖 控件的.NET程序员,Never!那么你就必须懂ASP.NET应用程序生命周期,懂ASP.N... 阅读全文

posted @ 2015-12-28 19:40 刑天 阅读(274) 评论(0) 推荐(0) 编辑

2015年9月23日

PHP面试总结

摘要: 总结:php部分按照面试常问的问题总结的,下面的问题在面试中出场率很高。问题比较基础--------------------PHP部分---------------------PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别1:echo... 阅读全文

posted @ 2015-09-23 09:01 刑天 阅读(206) 评论(0) 推荐(0) 编辑

2015年8月1日

ASP.NET MVC源码分析系列

摘要: Controller下的JsonResult的ExecuteResult方法public override void ExecuteResult(ControllerContext context){ if (context == null) { throw new Arg... 阅读全文

posted @ 2015-08-01 17:59 刑天 阅读(256) 评论(0) 推荐(0) 编辑

2015年6月25日

SQL中的重要语句

摘要: 1.查询每个数据库有多少空间被浪费 如果你想知道在你数据库设计后,每页有多少空间浪费掉,你可 以通过下列动态管理视图(DMV)查询下缓冲池:sys.dm_os_buffer_descriptors 从这个动态管理视图(DMV)显示的每条记录都代表当前在缓存池里保存的每一页,当你在有大内存的机器上查询... 阅读全文

posted @ 2015-06-25 19:45 刑天 阅读(432) 评论(0) 推荐(0) 编辑

2015年6月10日

Nicescroll滚动条插件的用法

摘要: Nicescroll滚动条插件是一个非常强大的基于JQUERY的滚动条插件,不需要增加额外的css,几乎全浏览器兼容。ie6+,实现只需要一段代码,侵入性非常小,样式可完全自定义,支持触摸事件,可在触摸屏上使用。官网地址:http://www.areaaperta.com/nicescroll/引入... 阅读全文

posted @ 2015-06-10 11:13 刑天 阅读(33633) 评论(3) 推荐(1) 编辑

2015年4月27日

Nunit2.5.10快速上手(笔记)

摘要: 1、下载Nunit:http://www.nunit.org/index.php?p=download,下载MSI格式的安装包;2、安装Nunit,根据提示安装即可,没有什么需要配置的,直接下一步就可以了。3、新建类库项目NUnitQuickStart,在该项目添加引用nunit.framework... 阅读全文

posted @ 2015-04-27 09:45 刑天 阅读(321) 评论(0) 推荐(0) 编辑

2014年1月27日

android与服务端通讯时使用到的GZIP压缩及解压

摘要: 为了减小android项目与服务端进行通讯时的数据流量,我们可以使用GZIP对服务端传输的数据进行压缩,在android客户端解压。或在客户端压缩,在服务端解压。代码如下:android客户端的GZIP操作类:import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutput 阅读全文

posted @ 2014-01-27 10:28 刑天 阅读(1900) 评论(2) 推荐(0) 编辑

2013年12月13日

sencha touch结合webservice读取jsonp数据详解

摘要: sencha touch读取jsonp数据主要依靠Ext.data.JsonP组件,在mvc的store文件中定义代码如下:Ext.define('eparkapp.store.ParksNearby',{ extend:'Ext.data.Store', requires: ['Ext.data.JsonP'], config:{ model: 'eparkapp.model.Park', autoLoad: true, proxy: { type: 'jsonp', url: 'http... 阅读全文

posted @ 2013-12-13 15:48 刑天 阅读(718) 评论(0) 推荐(0) 编辑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示