• 微软的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

  • 相关阅读:
    深入Spring之IOC之加载BeanDefinition
    Hexo+GitHub Actions 完美打造个人博客
    Spring中资源的加载原来是这么一回事啊!
    Web 跨域请求问题的解决方案- CORS 方案
    重新认识 Spring IOC
    Spring Data Jpa 入门学习
    前奏:Spring 源码环境搭建
    最短路径——floyd算法代码(c语言)
    leetcode 第184场周赛第一题(数组中的字符串匹配)
    如何用尾插法建立双链表(C语言,非循环)
  • 原文地址:https://www.cnblogs.com/morec/p/15799866.html
Copyright © 2020-2023  润新知