Json.net缓慢序列化和反序列化

我有一个问题 – Json.Net序列化我的对象真的很慢。 我有一些基础课:

public class authenticationRequest { public string userid; public string tid; public string token; public string platform; public string version; } 

而且我正在将它序列化

 string jsonDataToSend = JsonConvert.SerializeObject(dataToSend); 

此操作大约需要1900毫秒。 与来自Json.net CodePlex页面的信息相比 :

在此处输入图像描述

这需要很长时间。 出于测试目的,我将我的类交换为一个简单的字符串:

 string jsonDataToSend = JsonConvert.SerializeObject("fsdfsdfsdfs"); 

转换仍需要约900毫秒。 是什么原因? 我能做些什么来更快地序列化这些数据?

我相信这里发生的事情是你在加载Json.Net库时会遇到延迟。 您应该尝试在发布模式下进行编译,以查看事情是否会显着加快,因为这会阻止加载符号(这可能会增加库加载时间)。

如果它仍然是一个问题,请在您的应用程序中找到一个好时机,您可以进行虚拟序列化(甚至可能在后台线程上)以强制加载库。 尽管如此,它有点代码味道,因此可能有更好的方法来强制加载,但这是一种应该始终有效的powershell方法。

我正在处理的项目遇到了同样的问题,我按照此页面上的建议解决了这个问题: http : //www.newtonsoft.com/json/help/html/Performance.htm

具体来说,他们建议在性能至关重要时手动序列化对象:

 public static string ToJson(this Person p) { StringWriter sw = new StringWriter(); JsonTextWriter writer = new JsonTextWriter(sw); // { writer.WriteStartObject(); // "name" : "Jerry" writer.WritePropertyName("name"); writer.WriteValue(p.Name); // "likes": ["Comedy", "Superman"] writer.WritePropertyName("likes"); writer.WriteStartArray(); foreach (string like in p.Likes) { writer.WriteValue(like); } writer.WriteEndArray(); // } writer.WriteEndObject(); return sw.ToString(); } 

我在VB中的示例如下所示:

  Public Function SerializeWords(ByRef oWords As List(Of Word)) Dim sb As New StringBuilder Dim sw As New IO.StringWriter(sb) Using oWriter As Newtonsoft.Json.JsonWriter = New Newtonsoft.Json.JsonTextWriter(sw) With oWriter .WriteStartArray() For Each oWord As Word In oWords .WriteStartObject() .WritePropertyName("ID") .WriteValue(oWord.ID) .WritePropertyName("Phonics") .WriteValue(oWord.Phonics) .WritePropertyName("Word_") .WriteValue(oWord.Word_) .WritePropertyName("WordLength") .WriteValue(oWord.WordLength) .WriteEndObject() Next .WriteEndArray() End With End Using Return sb.ToString End Function 

注意它是如何强类型的。 我相信当你使用Newtonsoft.Json.JsonConvert.SerializeObject()它使用reflection来完成工作(当你有许多具有许多属性的对象时,它可以真正加起来)。

无论如何……一旦我编写了自己的序列化程序,我的序列化250个单词的时间从使用JsonConvert.SerializeObject()方法的28秒到使用我自己的函数的31毫秒。

在反序列化为dynamic数据类型而不是自定义数据类型时,使用“Newtonsoft.Json”库的JSON字符串反序列化对ARM的工作速度要快得多。

 var receivedObject = JsonConvert.DeserializeObject(content); 

但这更快:

 dynamic receivedObject = JObject.Parse(content);