Json.NET JsonSerializer线程是否安全?

Bri*_*chl 33 c# json.net

我正在尝试减少我的Web服务生成的垃圾量,我注意到我们正在JsonSerializer为每个请求创建一个新的Json.NET 实例.它不是有史以来最轻量级的对象,所以我想知道我是否可以创建单个实例并将其重用于所有请求.首先,这要求在序列化和反序列化期间它是线程安全的.

文档没有说明它是否是线程安全的.

检查代码似乎序列化和反序列化方法是线程安全的,只要您不同时更改对象上的任何设置.但是,这是一个复杂的课程,所以我不能100%肯定我的分析.

有没有人试过重用实例JsonSerializer并让它工作与否?重复使用是否有任何已知问题?

Jam*_*ing 42

检查代码似乎序列化和反序列化方法是线程安全的,只要您不同时更改对象上的任何设置.

正确,JsonSerializer是线程安全的.

序列化时不共享任何状态,但如果在序列化对象的过程中更改JsonSerializer的设置,则会自动使用这些设置.

  • JsonTextReader具有特定于它正在读取的JSON的状态,并且永远不会是线程安全的. (10认同)
  • @ JamesNewton-King很迟了,但是您是否同意我的[answer](/sf/answers/3902717311/),`JsonSerializer`的创建是如此便宜,以至于按需执行就可以了在绝大多数情况下都可以吗? (2认同)

Joe*_*nos 14

根据Newtonsoft网站上的功能比较,它是线程安全的,因为DataContractJsonSerializerJavaScriptSerializer.

在此输入图像描述

  • JSON.NET确实包含线程不安全类(显然),这只是一个通用产品功能矩阵。 (4认同)

Tyl*_*ley 7

如果您不使用引用,JsonSerializer则是线程安全的.但是,在多线程上下文中使用引用时会出现一些问题.

首先,默认情况下存在一个错误ReferenceResolver,可能导致使用重复的引用ID.请在此处查看GitHub问题.

其次,重用JsonSerializer默认值ReferenceResolver是有状态的,这样如果你使用引用,你的引用id将继续随着你所做的每个序列化调用而递增,而不是从每个序列化调用开始.我在这里创建了一个GitHub问题来解决这个问题.

  • 我已经更新了我的答案.我还在默认的`ReferenceResolver`中包含了对bug的引用. (2认同)