如果我在项目中使用相同的设置,我可以实例化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);
}
那么,我是否危险?
答案 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"?。