微软的Serialize和Newtonsoft的SerializeObject比较


微软的序列化反序列化组件出来已有好几年了,刚出来的时候各种吐槽。最近在优化代码,比较了一下微软的Serialize和Newtonsoft的SerializeObject,感觉大部分场景下可以用微软的序列化组件了,Newtonsoft第三方可能被我放弃掉。测试有交换顺序,也有多次测试。

 1 using Newtonsoft.Json;
 2 using System;
 3 using System.Diagnostics;
 4 namespace JsonTest
 5 {
 6     internal class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             var count = 10_000;
11             var elapsedMilliseconds = Serialize(count, () =>
12              {
13                  JsonConvert.SerializeObject(new WeatherForecast
14                  {
15                      Date = DateTime.Now,
16                      Summary = "Hot",
17                      TemperatureCelsius = 88
18                  });
19              });
20             Console.WriteLine($"serialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds");
21 
22             elapsedMilliseconds = Serialize(count, () =>
23             {
24                 System.Text.Json.JsonSerializer.Serialize(new WeatherForecast
25                 {
26                     Date = DateTime.Now,
27                     Summary = "Hot",
28                     TemperatureCelsius = 88
29                 });
30             });
31             Console.WriteLine($"serialize object count:{count}, textjson used : {elapsedMilliseconds} seconds");
32 
33             Console.WriteLine("***************************************************");
34 
35             count = 10_000_000;
36             elapsedMilliseconds = Serialize(count, () =>
37            {
38                JsonConvert.SerializeObject(new WeatherForecast
39                {
40                    Date = DateTime.Now,
41                    Summary = "Hot",
42                    TemperatureCelsius = 88
43                });
44            });
45             Console.WriteLine($"serialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds");
46 
47             elapsedMilliseconds = Serialize(count, () =>
48             {
49                 System.Text.Json.JsonSerializer.Serialize(new WeatherForecast
50                 {
51                     Date = DateTime.Now,
52                     Summary = "Hot",
53                     TemperatureCelsius = 88
54                 });
55             });
56             Console.WriteLine($"serialize object count:{count}, textjson used : {elapsedMilliseconds} seconds");
57             Console.ReadKey();
58 
59             /*
60              serialize object count:10000, newtonsoft used: 288 seconds
61             serialize object count:10000, textjson used : 45 seconds
62             ***************************************************
63             serialize object count:10000000, newtonsoft used: 10324 seconds
64             serialize object count:10000000, textjson used : 5681 seconds
65              */
66         }
67 
68         static long Serialize(int count, Action action)
69         {
70             Stopwatch stopwatch = Stopwatch.StartNew();
71             for (int i = count; i > 0; i--)
72             {
73                 action();
74             }
75             stopwatch.Stop();
76             var result = stopwatch.ElapsedMilliseconds;
77             stopwatch.Reset();
78             return result;
79         }
80     }
81     internal class WeatherForecast
82     {
83         public DateTimeOffset Date { get; set; }
84         public int TemperatureCelsius { get; set; }
85         public string Summary { get; set; }
86     }
87 }

 

当然如果加上JsonSerializerOptions,而且全部配置起来性能就会有所下降,毕竟这么多配置在这呢,但是这样也会更加灵活。

下面是反序列化的例子,速度和序列化比较差不多。

 1 using Newtonsoft.Json;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Diagnostics;
 5 using System.Linq;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8 
 9 namespace JsonTest
10 {
11     internal class App
12     {
13         static void Main(string[] args)
14         {
15             var jsonStr = "{\"Date\":\"2019 - 08 - 01T00: 00:00 - 07:00\",\"TemperatureCelsius\":25,\"Summary\":\"Hot\",\"DatesAvailable\":[\"2019 - 08 - 01T00: 00:00 - 07:00\",\"2019 - 08 - 02T00: 00:00 - 07:00\"],\"TemperatureRanges\":{\"Cold\":{\"High\":20,\"Low\":-10},\"Hot\":{\"High\":60,\"Low\":20}},\"SummaryWords\":[\"Cool\",\"Windy\",\"Humid\"]}";
16             var count = 10_000;
17             var elapsedMilliseconds = Derialize(count, () =>
18             {
19                 JsonConvert.DeserializeObject<Student>(jsonStr);
20             });
21             Console.WriteLine($"deserialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds");
22 
23             elapsedMilliseconds = Derialize(count, () =>
24             {
25                 System.Text.Json.JsonSerializer.Deserialize<Student>(jsonStr);
26             });
27             Console.WriteLine($"deserialize object count:{count}, textjson used : {elapsedMilliseconds} seconds");
28 
29             Console.WriteLine("***************************************************");
30 
31             count = 10_000_000;
32             elapsedMilliseconds = Derialize(count, () =>
33             {
34                 JsonConvert.DeserializeObject<Student>(jsonStr);
35             });
36             Console.WriteLine($"deserialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds");
37 
38             elapsedMilliseconds = Derialize(count, () =>
39             {
40                 System.Text.Json.JsonSerializer.Deserialize<Student>(jsonStr);
41             });
42             Console.WriteLine($"deserialize object count:{count}, textjson used : {elapsedMilliseconds} seconds");
43             /*
44              deserialize object count:10000, newtonsoft used: 263 seconds
45             deserialize object count:10000, textjson used : 56 seconds
46             ***************************************************
47             deserialize object count:10000000, newtonsoft used: 29726 seconds
48             deserialize object count:10000000, textjson used : 12422 seconds
49 
50              */
51             Console.ReadKey();
52         }
53         static long Derialize(int count, Action action)
54         {
55             Stopwatch stopwatch = Stopwatch.StartNew();
56             for (int i = count; i > 0; i--)
57             {
58                 action();
59             }
60             stopwatch.Stop();
61             var result = stopwatch.ElapsedMilliseconds;
62             stopwatch.Reset();
63             return result;
64         }
65 
66     }
67 
68     internal class Student
69     {
70         public DateTime BarthDay { get; set; }
71         public int Age { get; set; }
72         public string Name { get; set; }
73     }
74 }

 

微软文档里面有各种介绍,不再详述!

 从 Newtonsoft.Json 迁移到 System.Text.Json - .NET | Microsoft Docs

引用来源:https://www.cnblogs.com/morec/p/15799866.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:C# - 逆变的具体应用场景
下一篇:C# 设置或验证 PDF中的文本域格式
评论列表

发表评论

评论内容
昵称:
关联文章

SerializeNewtonsoftSerializeObject比较
C# Newtonsoft.Json.JsonConvert.SerializeObject生成格式化JSON字符串
NuGet官方中国国内镜像
也谈string.JoinStringBuilder性能比较
C# 使用Newtonsoft对象转JSON字符串时候日期类型处理
信支付:C#计算签名
如何关掉serial number> 弹窗
Asp.net 信H5唤起支付支付回调
ABP VNext框架中Winform终端开发客户端授权信息处理
详解ElasticAPM实现服务链路追踪(NET)
信支付:header中mchid与post payload中mchid不匹配
C# Newtonsoft日期格式化处理
使用.NET 6开发TodoList应用(31)——实现基于Github ActionsACICI/CD
熔断降级初步详解实现(NET Core控制台输出讲解Polly)
信浏览器网页调试几中方法
javascript中letvar区别
面试官:如果存取IP地址,用什么数据类型比较好 (C#版本)
.NET 服务——CI/CD(4):避坑一点经验
在Winform项目Web API.NetCore项目中使用Serilog 来记录日志信息
信支付:JSAPI支付 开发手册

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码