Json.net slow serialization and deserialization

后端 未结 3 912
南笙
南笙 2021-02-01 09:24

I have a problem - Json.Net serializing my objects realy slow. I have some basic class:

public class authenticationRequest
{
    public string userid;
    public         


        
相关标签:
3条回答
  • 2021-02-01 09:43

    JSON string deserialization using the "Newtonsoft.Json" library works much faster for me on ARM when deserializing to the dynamic data type instead of a custom one.

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

    but this is even faster:

    dynamic receivedObject = JObject.Parse(content);
    
    0 讨论(0)
  • 2021-02-01 09:49

    What I believe is happening here is that you are getting a delay when the Json.Net library is being loaded. You should try compiling in Release mode to see if things speed up considerably, as this should prevent symbols from being loaded (which can add to the library load time).

    If it is still an issue, find a good time in your app that you can do a dummy serialization (perhaps even on a background thread) to force the library to load. That has a bit of code-smell to it, though, so there may be a better way of forcing the load, but that's a brute force method that should work all the time.

    0 讨论(0)
  • 2021-02-01 10:04

    I had the same problem with a project I'm working on and I solved it by following the advice on this page: http://www.newtonsoft.com/json/help/html/Performance.htm

    Specifically, they recommend manually serializing your objects when performance is critical:

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

    My example in VB looks like this:

        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
    

    Notice how it's strongly typed. I believe when you use Newtonsoft.Json.JsonConvert.SerializeObject() it's using reflection to get the job done (which can really add up when you have many objects with many properties).

    Anyways... once I wrote my own serializer, my time serializing a list of 250 words went from 28 seconds using JsonConvert.SerializeObject() method to 31 milliseconds using my own function.

    0 讨论(0)
提交回复
热议问题