12

我有一个问题 - 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 毫秒。是什么原因?我可以做些什么来更快地序列化这些数据?

4

3 回答 3

17

我正在处理的一个项目遇到了同样的问题,我按照此页面上的建议解决了这个问题: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() 它时,它会使用反射来完成工作(当你有许多具有许多属性的对象时,它真的可以加起来)。

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

于 2015-02-05T14:05:20.943 回答
5

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

如果它仍然是一个问题,请在您的应用程序中找到一个很好的时间,您可以执行虚拟序列化(甚至可能在后台线程上)以强制加载库。不过,这有点代码味道,所以可能有更好的强制加载方法,但这是一种应该一直有效的蛮力方法。

于 2012-04-10T13:47:54.583 回答
1

dynamic当反序列化为数据类型而不是自定义类型时,使用“Newtonsoft.Json”库的 JSON 字符串反序列化对我来说在 ARM 上工作得更快。

var receivedObject = JsonConvert.DeserializeObject<dynamic>(content);

但这甚至更快:

dynamic receivedObject = JObject.Parse(content);
于 2017-05-16T09:04:17.140 回答