微软的Serialize和Newtonsoft的SerializeObject比较
2022-01-13 22:00
1506 查看
微软的序列化反序列化组件出来已有好几年了,刚出来的时候各种吐槽。最近在优化代码,比较了一下微软的Serialize和Newtonsoft的SerializeObject,感觉大部分场景下可以用微软的序列化组件了,Newtonsoft第三方可能被我放弃掉。测试有交换顺序,也有多次测试。
using Newtonsoft.Json; using System; using System.Diagnostics; namespace JsonTest { internal class Program { static void Main(string[] args) { var count = 10_000; var elapsedMilliseconds = Serialize(count, () => { JsonConvert.SerializeObject(new WeatherForecast { Date = DateTime.Now, Summary = "Hot", TemperatureCelsius = 88 }); }); Console.WriteLine($"serialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds"); elapsedMilliseconds = Serialize(count, () => { System.Text.Json.JsonSerializer.Serialize(new WeatherForecast { Date = DateTime.Now, Summary = "Hot", TemperatureCelsius = 88 }); }); Console.WriteLine($"serialize object count:{count}, textjson used : {elapsedMilliseconds} seconds"); Console.WriteLine("***************************************************"); count = 10_000_000; elapsedMilliseconds = Serialize(count, () => { JsonConvert.SerializeObject(new WeatherForecast { Date = DateTime.Now, Summary = "Hot", TemperatureCelsius = 88 }); }); Console.WriteLine($"serialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds"); elapsedMilliseconds = Serialize(count, () => { System.Text.Json.JsonSerializer.Serialize(new WeatherForecast { Date = DateTime.Now, Summary = "Hot", TemperatureCelsius = 88 }); }); Console.WriteLine($"serialize object count:{count}, textjson used : {elapsedMilliseconds} seconds"); Console.ReadKey(); /* serialize object count:10000, newtonsoft used: 288 seconds serialize object count:10000, textjson used : 45 seconds *************************************************** serialize object count:10000000, newtonsoft used: 10324 seconds serialize object count:10000000, textjson used : 5681 seconds */ } static long Serialize(int count, Action action) { Stopwatch stopwatch = Stopwatch.StartNew(); for (int i = count; i > 0; i--) { action(); } stopwatch.Stop(); var result = stopwatch.ElapsedMilliseconds; stopwatch.Reset(); return result; } } internal class WeatherForecast { public DateTimeOffset Date { get; set; } public int TemperatureCelsius { get; set; } public string Summary { get; set; } } }
当然如果加上JsonSerializerOptions,而且全部配置起来性能就会有所下降,毕竟这么多配置在这呢,但是这样也会更加灵活。
下面是反序列化的例子,速度和序列化比较差不多。
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JsonTest { internal class App { static void Main(string[] args) { 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\"]}"; var count = 10_000; var elapsedMilliseconds = Derialize(count, () => { JsonConvert.DeserializeObject<Student>(jsonStr); }); Console.WriteLine($"deserialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds"); elapsedMilliseconds = Derialize(count, () => { System.Text.Json.JsonSerializer.Deserialize<Student>(jsonStr); }); Console.WriteLine($"deserialize object count:{count}, textjson used : {elapsedMilliseconds} seconds"); Console.WriteLine("***************************************************"); count = 10_000_000; elapsedMilliseconds = Derialize(count, () => { JsonConvert.DeserializeObject<Student>(jsonStr); }); Console.WriteLine($"deserialize object count:{count}, newtonsoft used: {elapsedMilliseconds} seconds"); elapsedMilliseconds = Derialize(count, () => { System.Text.Json.JsonSerializer.Deserialize<Student>(jsonStr); }); Console.WriteLine($"deserialize object count:{count}, textjson used : {elapsedMilliseconds} seconds"); /* deserialize object count:10000, newtonsoft used: 263 seconds deserialize object count:10000, textjson used : 56 seconds *************************************************** deserialize object count:10000000, newtonsoft used: 29726 seconds deserialize object count:10000000, textjson used : 12422 seconds */ Console.ReadKey(); } static long Derialize(int count, Action action) { Stopwatch stopwatch = Stopwatch.StartNew(); for (int i = count; i > 0; i--) { action(); } stopwatch.Stop(); var result = stopwatch.ElapsedMilliseconds; stopwatch.Reset(); return result; } } internal class Student { public DateTime BarthDay { get; set; } public int Age { get; set; } public string Name { get; set; } } }
微软文档里面有各种介绍,不再详述!
从 Newtonsoft.Json 迁移到 System.Text.Json - .NET | Microsoft Docs
相关文章推荐
- @Html.Raw() 与Newtonsoft.Json.JsonConvert.SerializeObject()
- Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader
- Newtonsoft.Json.SerializeObject 转换参数
- Json.net的常用语句JsonConvert.SerializeObject(对象)
- object-C 与 C++的比较
- ArrayList的方法:remove(object o) 、remove(int index)、removeAll(Collection c)时间复杂度的比较
- java泛型与object的比较
- ParaView 比较重要的两个类:vtkObject与vtkKdTreeManager
- 微软产品与各厂商的比较
- 泛型与object的比较
- Redis 数据序列化方法 serialize, msgpack, json, hprose 比较
- JsonConvert.SerializeObject 空值处理
- json,serialize,msgpack比较
- 微软发布搜索引擎 兼谈几个搜索引擎的比较
- 和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧。因为,很多PCI的例子都是对S5933,就连微软出版的《Programming the Microsoft Windows Driver Model》都提供了一个完整的S5933的例子。 在这篇有关DDK的开发论文里。
- objecti-c中的 比较前置串和后置串, 遍历数组和字典的用法
- 苹果(IOS) 微软(wp)和谷歌(androd)比较
- js获得form表单的值$('#form1').serializeObject()/serialize()/serializeArray对比及判断表单中是否有输入框未输入值
- JavaScript中set,map,array,object用法比较
- 微软,谷歌和雅虎收购比较