簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM