JsonSerializerSettings 是否线程安全?

13
如果我在整个项目中使用相同的设置,那么我可以实例化一个静态的JsonSerializerSettings对象并在整个项目中重复使用吗?
例如:
private static readonly JsonSerializerSettings settings = new JsonSerializerSettings {
    Formatting              = Formatting.Indented,
    TypeNameHandling        = TypeNameHandling.None,
    DateFormatHandling      = DateFormatHandling.IsoDateFormat,
    TypeNameAssemblyFormat  = FormatterAssemblyStyle.Simple
};

public static string ToJSONString(this Object source) {
    return JsonConvert.SerializeObject(source, settings);
}   

那么,我是不是线程危险


1
在将设置设置为静态的情况下,是否真的能够获得可衡量的性能提升? - Uwe Keim
所以,当没有性能问题时,只需将“settings”设置为“ToJSONString”的局部变量,所有可能的线程问题都会消失 :-) - Uwe Keim
2
@UweKeim - 你假设没有其他原因来编写代码。即使你不同意,我去查看了类是否线程安全,但无法在任何地方找到相关信息。现在这些信息已经存在,供其他人参考。 - EBarr
6
我不是在问我应该如何设计一段软件代码。我的其他原因与社区无关且过于具体化,因此并不相关。我在问这个对象是否线程安全。对于这个问题的答案是客观事实。如何设计我的软件代码是基于观点的,并且更适合在http://codereview.stackexchange.com/上提问。 - EBarr
你能否找出它是否是线程安全的? - Rico Suter
显示剩余4条评论
2个回答

8
以下是关于Twitter上的对话,@JamesNK 是JSON.net的作者:https://twitter.com/jonathan_oliver/status/332227095616966656 Jonathan Oliver问道:“静态JsonConvert.DeserializeObject方法是线程安全的吗?使用5.0.4和5.0.5时出现一些奇怪的错误。”
回复如下:
James Newton-King表示:“是的。如果不是,请在GitHub上创建问题报告。”
另一条回复如下:
Jonathan Oliver表示:“@JamesNK事实证明,与JsonConvert一起使用的带有静态JsonSerializerSettings对象的ContractResolver不是线程安全的。”
虽然从未提出过错误,但这暗示了设计的整体线程安全性,但也可能有特定的实现方式会破坏它。

3

由于您说您不会改变JsonSerializerSettings,因此无需担心线程安全性。线程竞争只会在另一个线程中修改共享数据时发生,但这里并非如此。

我建议您阅读这篇文章,最终您应该对线程、线程安全等有很好的理解。

此外,线程安全是一个更通用的术语,您需要更精确地说明您所指的内容。请参考“什么是‘线程安全’?”了解更多信息。


3
这是一个勇敢的假设,即 JsonConvert.SerializeObject 在第二个参数上是线程安全的。你是怎么知道的?你是否阅读了文档或查看了源代码? - Uwe Keim
1
我的措辞有些随意,很好,有趣的是我之前已经读过那篇文章。我的问题并不是关于这个概念的一般性问题,而是@UweKeim指出的风险——我不知道Json.net在内部如何处理设置。 - EBarr
@UweKeim 第二个参数为什么不是线程安全的?在对象中设置某些属性并在多个线程中读取,意味着它们应该是线程安全的,除非这些属性被计算并返回。这是一个直观的假设,即SerializeObject不应该改变传入的设置。顺便问一下,你如何认为这不是线程安全的?除非我们查看源代码,否则无法回答。 - Sriram Sakthivel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接