夸克之书

  • 首页
  • 科普
  • 笔记
  • .NET/C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. 默认
  3. 正文

System.Text.Json与Newtonsoft.Json Json序列化与反序列化性能对比

2022-07-10 8476点热度 0人点赞 0条评论

JSON已经成为几乎所有现代.NET应用程序的重要组成部分。目前.NET处理JSON主要使用System.Text.Json和Newtonsoft.Json这两个库。

从.NET Core 3.0开始,System.Text.Json就作为内置的Json序列化与反序列化工具,以替代Newtonsoft.Json(据说Newtonsoft.Json的开发者都入职微软了)。根据微软官方描述,相对于Newtonsoft.Json,可以获得1.3倍速--5倍的速度,具体也取决于使用场景。

于是我做了个实验,来对比了下System.Text.Json和Newtonsoft.Json的序列化与反序列化的性能。顺便加入了已经弃用的二进制序列化方式。

实验方法为对同一个对象进行序列化和反序列化,反复执行100000次,取20次的平均时间。对照组有4个,分别是BinaryFormatter、System.Text.Json一般字符串序列化、System.Text.Json Utf8Bytes序列化、Newtonsoft.Json序列化。

相对Newtonsoft.Json而言,System.Text.Json序列化和反序列化更加严格,比如默认区分发大小写,不会序列化公共字段等。为了贴合日常使用场景,System.Text.Json测试方法解除了一些限制,并加入了4个常用的自定义JsonConverter类型。

System.Text.Json的JsonSerializerOptions构造方法如下:

private static JsonSerializerOptions BuildOptions(JsonSerializerOptions options)
{
    if (options == null)
    {
        lock (_locker)
        {
            if (_options == null)
            {
                _options = new JsonSerializerOptions()
                {
                    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
                    //忽略大小写
                    PropertyNameCaseInsensitive = true,
                    //允许注释
                    ReadCommentHandling = JsonCommentHandling.Skip,
                    //允许尾随逗号
                    AllowTrailingCommas = true,
                    //允许将字符串读取为数字
                    NumberHandling = JsonNumberHandling.AllowReadingFromString,
                    //包含公共字段
                    IncludeFields = true,

                };
                _options.Converters.Add(new DateTimeConverter());
                _options.Converters.Add(new DateTimeNullableConverter());
                _options.Converters.Add(new ExceptionConverter());
                _options.Converters.Add(new TypeConverter());
            }
        }
    }
    return _options;
}

测试对象如下:

 [Serializable]
 public class SystemLog
 {
     public int Id { get; set; }

     public string LogType { get; set; }

     public string Describe { get; set; }

     public string Localtion { get; set; }

     public string Stack { get; set; }

     public DateTime CreateTime { get; set; }

     public Guid Guid { get; set; }

     public Dictionary<string, object> ExtFileds { get; set; }
 }

private static readonly SystemLog testModel = new SystemLog()
{
    Id = 1,
    LogType = "Error",
    Describe = "这个是描述,这个是描述,这个是描述,这个是描述,这个是描述",
    Stack = "",
    CreateTime = DateTime.Parse("2022-07-10"),
    Guid = Guid.NewGuid(),
    ExtFileds = new Dictionary<string, object>()
    {
        { "A", DateTime.Parse("2022-07-10")},
        { "B", "AAAAAA"},
    }
};

测试电脑环境:
CPU: i7-12700KF 3.61 GHz
内存:DDR4 3600 32G

使用包版本:

Newtonsoft.Json:13.0.1
System.Text.Json:6.0.5
.NET:6.0

测试结果如下:

%title插图%num

100000次序列化耗时:

二进制序列化:2405ms
System.Text.Json:279ms
System.Text.Json Utf8Bytes:217ms
Newtonsoft.Json:287ms

在这个场景下面,System.Text.Json比Newtonsoft.Json快了3%,System.Text.Json Utf8Bytes比Newtonsoft.Json快了24%,System.Text.Json Utf8Bytes比System.Text.Json快了0.22%。

根据测试结果,不难看出,System.Text.Json相对Newtonsoft.Json而言,确实有性能优势。特别是序列化UTF-8 字节数组时,对比更加明显, 出现这种差别的原因是字节(作为 UTF-8)不需要转换为字符串 (UTF-16)。

在进行实验时,额外加入了二进制序列化(BinaryFormatter)的对照组。结果很让人意外,BinaryFormatter在对同一对象的序列化和反序列100000次耗时2405ms,比常见的Json序列化慢了7-8倍,序列化之后的byte数组更比json通过UTF8编码后的byte数组大了6.5倍,原因是二进制序列化后的结果包含大量的元数据。

微软官方已经抛弃了BinaryFormatter ,因为二进制序列化可能会十分危险。 有关详细信息,可以参阅 BinaryFormatter 安全指南。

测试代码:

SerializeTest下载

如有任何不正确地方法,还请多多指教,大家一起交流学习。

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2023-03-20

afirefish

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论
放松一下
https://www.quarkbook.com/wp-content/uploads/2021/05/凤凰传奇-海底(Live).flac
分类
  • .NET/C#
  • Linux
  • 树莓派
  • 物联网
  • 科普
  • 笔记
  • 算法
  • 默认
最新 热点 随机
最新 热点 随机
在代码中判断龙芯新旧世界平台 Windows获取固定后缀的IPv6地址 目前为止,你可能找不到第二台支持志强的1L小主机(P350 Tiny+W-1350+ECC+双NVME+PCIE扩展)!!! iKuai(爱快)实现成都移动IPTV IPoE拨号 Linux EXT4分区误删除后数据恢复 C#连接到巴法云
在代码中判断龙芯新旧世界平台
ESXi 6.7 切换时区(已经确认无效) Windows Server 2022安装Intel I225-V/I226-V驱动 ASP.NET Core 3.1 WebApi Swagger与API版本控制的美妙结合 解决Github pull和push慢(Github设置代理) 树莓派等ARM开发板C#串口通信(.NET Core) 目前为止,你可能找不到第二台支持志强的1L小主机(P350 Tiny+W-1350+ECC+双NVME+PCIE扩展)!!!
最近评论
Eagle 发布于 7 个月前(10月21日) 参考博主教程成功搞定了成都移动IPTV组播转单播,电脑、手机都可以播放了。但目前有个问题,原IPTV...
rundoze 发布于 9 个月前(08月31日) 牛逼
cc21216695 发布于 2 年前(09月27日) 试了一下,加入启动项也无效,压根没有用
afirefish 发布于 3 年前(11月28日) 非常感谢,非常棒!
》随缘《 发布于 3 年前(11月20日) 最新【一键处理】方法: https://github.com/MrXhh/VSTools/rele...
书签
  • 打赏
  • 毒鸡汤
  • 米店
  • 金鱼直播间

COPYRIGHT © 2023 quarkbook.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备15036129号-9

登录
注册|忘记密码?