测试代码(Nuget引入Newtonsoft.Json和ServiceStack.Text两个dll)
public class People
{
public string Id { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public string Phone { get; set; }
public int Height { get; set; }
public int Weight { get; set; }
}
class Program
{
static void Main()
{
TimerDeserialize(50000);
TimerDeserialize(100000);
TimerDeserialize(500000);
TimerDeserialize(1000000);
Console.ReadKey();
}
private static void TimerSerialize(int count)
{
var people = new People { Id = "1", Name = "测试", Sex = "男", Phone = "1546789712", Height = 170, Weight = 120 };
Stopwatch jsonWatch = new Stopwatch();
jsonWatch.Start();
for (int i = 0; i < count; i++)
{
var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(people);
}
jsonWatch.Stop();
Console.WriteLine($"Newtonsoft.Json 序列化对象数量:{count},耗时:{jsonWatch.ElapsedMilliseconds} ms");
Stopwatch stackWatch = new Stopwatch();
stackWatch.Start();
for (int i = 0; i < count; i++)
{
var jsonStr = ServiceStack.Text.JsonSerializer.SerializeToString(people);
}
stackWatch.Stop();
Console.WriteLine($"ServiceStack.Text 序列化对象数量:{count},耗时:{stackWatch.ElapsedMilliseconds} ms");
}
private static void TimerDeserialize(int count)
{
var jsonStr = "{ \"Id\":\"1\",\"Name\":\"测试\",\"Sex\":\"男\",\"Phone\":\"1546789712\",\"Height\":170,\"Weight\":120,\"cars\":[{\"Color\":\"White\",\"Price\":483924028.00,\"BuyDate\":\"2019-04-03T13:31:36.1883973+08:00\"}]}";
Stopwatch jsonWatch = new Stopwatch();
jsonWatch.Start();
for (int i = 0; i < count; i++)
{
var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<People>(jsonStr);
}
jsonWatch.Stop();
Console.WriteLine($"Newtonsoft.Json 反序列化对象数量:{count},耗时:{jsonWatch.ElapsedMilliseconds} ms");
Stopwatch stackWatch = new Stopwatch();
stackWatch.Start();
for (int i = 0; i < count; i++)
{
var stackOjbect = ServiceStack.Text.JsonSerializer.DeserializeFromString<People>(jsonStr);
}
stackWatch.Stop();
Console.WriteLine($"ServiceStack.Text 反序列化对象数量:{count},耗时:{stackWatch.ElapsedMilliseconds} ms");
}
}
结果:
在大数据的情况下,ServiceStack.Text反序列化是Newtonsoft.Json的两倍左右。序列化相差不大。
现在ServiceStack.Text是收费的了还好是开源,看到了有文章写的可以接触配额限制,转载过来
原文地址:http://blog.csdn.net/hao_ds/article/details/73648130
ServiceStack 4.0 开始已经成为商业产品,不再完全免费,好在是开源的,主要限制免费配额功能在ServiceStack.Text类库下的LicenseUtils.cs文件中,仅需从GitHub上下载源码后添加一行代码重新编译即可解除限制,如下图:
注意事项:
在使用ServiceStack.Text的序列化为json格式的时候,当属性为datetime的时候,返回的是一个new date(324234234)的字符串,如果想返回yyyy-MM-dd HH:mm:ss格式的日期,需要修改源码,在jsconfig.cs加入以下代码:
private static bool dMsDatetimeFormat=true;
public static bool MsDatetimeFormat
{
get { return dMsDatetimeFormat; }
set { dMsDatetimeFormat = value; }
}
这是用来标示是否转化为刚才看到的那种自定义的格式。
接着 修改DateTimeSerializer.cs文件的 public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)方法
修改后的代码如下
public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
{
if (JsConfig.AssumeUtc && dateTime.Kind == DateTimeKind.Unspecified)
{
dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
}
if (JsConfig.DateHandler == DateHandler.ISO8601)
{
writer.Write(dateTime.ToString("o", CultureInfo.InvariantCulture));
return;
}
if (JsConfig.DateHandler == DateHandler.RFC1123)
{
writer.Write(dateTime.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture));
return;
}
var timestamp = dateTime.ToUnixTimeMs();
string offset = null;
if (dateTime.Kind != DateTimeKind.Utc)
{
if (JsConfig.DateHandler == DateHandler.TimestampOffset && dateTime.Kind == DateTimeKind.Unspecified)
offset = UnspecifiedOffset;
else
offset = LocalTimeZone.GetUtcOffset(dateTime).ToTimeOffsetString();
}
else
{
// Normally the JsonDateHandler.TimestampOffset doesn't append an offset for Utc dates, but if
// the JsConfig.AppendUtcOffset is set then we will
if (JsConfig.DateHandler == DateHandler.TimestampOffset && JsConfig.AppendUtcOffset.HasValue && JsConfig.AppendUtcOffset.Value)
offset = UtcOffset;
}
if (JsConfig.MsDatetimeFormat)
{
writer.Write(dateTime.ToString("yyyy-MM-dd hh:mm:ss"));
}
else
{
writer.Write(EscapedWcfJsonPrefix);
writer.Write(timestamp);
if (offset != null)
{
writer.Write(offset);
}
writer.Write(EscapedWcfJsonSuffix);
}
}
这样再使用序列化方法的时候返回的就是’2015-09-08 11:11:11’的格式了
当你不想用的时候,想恢复默认的方式,只要序列化前用这句就行了
ServiceStack.Text.JsConfig.MsDatetimeFormat = false;