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);