![](/img/trans.png)
[英]json.net serialization/deserialization of datetime 'unspecified'
[英]Json.net slow serialization and deserialization
我有一個問題 - Json.Net 序列化我的對象真的很慢。 我有一些基本的 class:
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頁面的信息相比:
這需要很長時間。 出於測試目的,我將 class 換成了一個簡單的字符串:
string jsonDataToSend = JsonConvert.SerializeObject("fsdfsdfsdfs");
轉換仍然需要 ~900 毫秒。 是什么原因? 我可以做些什么來更快地序列化這些數據?
我正在處理的項目遇到了同樣的問題,我按照此頁面上的建議解決了這個問題: 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()
時,它正在使用反射來完成工作(當您有許多具有許多屬性的對象時,這真的會加起來)。
無論如何...一旦我編寫了自己的序列化程序,我序列化 250 個單詞列表的時間從使用 JsonConvert.SerializeObject() 方法的 28 秒變為使用我自己的 function 的 31 毫秒。
我相信這里發生的是,當加載 Json.Net 庫時,您會遇到延遲。 您應該嘗試在 Release 模式下編譯以查看速度是否大大加快,因為這應該可以防止加載符號(這會增加庫加載時間)。
如果它仍然是一個問題,請在您的應用程序中找到一個好的時間,您可以進行虛擬序列化(甚至可能在后台線程上)以強制加載庫。 不過,這有點代碼味道,因此可能有更好的強制加載方法,但這是一種應該一直有效的蠻力方法。
JSON 使用“Newtonsoft.Json”庫的字符串反序列化在 ARM 上對我來說更快,當反序列化為dynamic
數據類型而不是自定義數據類型時。
var receivedObject = JsonConvert.DeserializeObject<dynamic>(content);
但這更快:
dynamic receivedObject = JObject.Parse(content);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.