将更快的Json数据加载/反序列化为C#对象

时间:2017-07-04 16:40:26

标签: c# json json.net

在我的代码中,我使用Newtonsoft.Json:

MyCSharpTargetClass foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string);

json_string的内容是常量(从永远不会更改的文件加载)。

功能很好,但反序列化过程执行缓慢。

我的问题:有没有办法预先计算对象,或者把它放在一个常数*,或者什么加速执行?

注意:实际上我没有设法将JsonConvert.DeserializeObject&lt; ...&gt;()的结果设为常量,但我是C#的新手,所以我应该错过一些东西。

感谢您的帮助

[EDIT]解决方案:强制在应用程序启动时加载Newtonsoft程序集。

2 个答案:

答案 0 :(得分:1)

实际上并没有很多人认为你可以做到这一点来加快速度。

  1. 使用ignore属性,因此不会添加此字段。将此用于某些属性或可计算属性/字段,以后可以重新计算。 希望这个链接有所帮助:

    https://msdn.microsoft.com/en-us/library/system.runtime.serialization.ignoredatamemberattribute.aspx

  2. 使用线程读取/写入对象,如果可以将数据自定义为多个文件并在线程中序列化/反序列化。

  3. 反序列化JSON算法需要读取整个文件大约3次。 为了获得更好的性能,您可以使用 YAML 。简单如XML / JSON,但具有更好的性能,因为它只读取文件一次。
  4. 在字段中使用较短的DataMember名称 [DataMember(Name = "id")] public int MyObjectForSomethink{get;set;}

答案 1 :(得分:1)

您可以像对待任何其他对象一样:将其设为private成员变量,其值只计算一次:

private static readonly MyCSharpTargetClass foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string);

或者在构造函数中执行:

private readonly MyCSharpTargetClass foo;

public MyObject()
{
    foo = JsonConvert.DeserializeObject<MyCSharpTargetClass>(json_string);
}

这样就可以完成一次反序列化字符串的工作。