您的位置:首页 > 移动开发 > Objective-C

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: