JsonSerializerSettings线程安全吗?

时间:2014-04-19 13:54:20

标签: c# thread-safety json.net

如果我在项目中使用相同的设置,我可以实例化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);
}   

那么,我是否危险

2 个答案:

答案 0 :(得分:4)

以下对话发生在Twitter上,@ JamesNK是JSON.net的作者:https://twitter.com/jonathan_oliver/status/332227095616966656

  

来自:Jonathan Oliver @jonathan_oliver致:@JamesNK

     

静态JsonConvert.DeserializeObject方法线程是否安全?使用5.0.4和5.0.5获得一些奇怪的错误。

响应:

  James Newton-King♔@JamesNK 2013年5月8日@jonathan_oliver

     

是。如果GitHub不是

,请在GitHub上创建一个问题

响应:

  

Jonathan Oliver @jonathan_oliver 2013年5月9日

     

@JamesNK事实证明,附加到我与JsonConvert一起使用的静态JsonSerializerSettings对象的ContractResolver不是线程安全的。

我没有看到曾经提交过一个bug,但这确实暗示它们的设计应该是线程安全的,但是可能有特定的实现方式来破坏它或者它可能不是一个整体。

答案 1 :(得分:2)

既然你说你没有变异JsonSerializerSettings,就不必担心线程安全了。线程竞争只有在修改另一个线程中的共享数据时才会发生,但这不是这种情况。

我建议你阅读this article,最后你应该对线程,线程安全等有一个很好的理解。

线程安全也是一个更通用的术语,你需要更准确地表达你的意思。有关详细信息,请参阅What is this thing you call "thread safe"?