JavascriptSerializer或JavascriptDeserializer线程的不同实例上的不同线程是否安全

时间:2013-10-18 16:07:17

标签: .net json multithreading serialization thread-safety

我在这里寻找明确的答案。

根据the documentation,JavascriptSerializer的公共静态方法是线程安全的,但非静态方法则不是。

是否保证对于此类的公共非静态方法,运行不同线程的不同实例是线程安全的(即没有可能违反线程安全的私有静态资源)?它特别是我感兴趣的JavascriptSerializer和JavascriptDeserializer中的序列化和反序列化的方法,但是我们想知道答案。

即如果线程A仅在实例A上运行而线程B仅在实例B上运行,那么在该场景中是否有公共非静态方法的线程安全的明确保证?

3 个答案:

答案 0 :(得分:5)

回顾一下问题:JavaScriptSerializer的离散实例是否可以在不同的线程上使用,最多只有一个线程与特定实例进行交互?

  

我在这里寻找明确的答案。

我不能给你那个。但是,(正如您可能知道的那样)文档中的线程安全消息非常通用,几乎出现在任何地方(例外是管理并发的类型)。

轶事:我不知道存储非线程安全的共享内部状态的任何类型。这无异于询问您是否可以在两个不同的线程上使用ListXmlDocument的两个不同实例;如果你不能,框架将毫无用处。

JavaScriptSerializer意味着在多个线程上多次实例化,就像Web服务器一样(ASP.Net线程非常复杂,但是在不同的线程上肯定会创建和调用多个类型的实例)。 MVC框架在内部使用JavaScriptSerializer,因此很明显团队打算在多线程Web环境中使用它。

反编译源的快速视图显示没有共享的内部状态。正如@usr所说,内部实施并不保证一致性。但是,由于上述原因,这种情况似乎不太可能发生变化。

所有这一切,JSON.net library通常被认为是JSON(de)序列化的优越替代品,因为它的性能和灵活性。

答案 1 :(得分:1)

您无法保证线程安全,因为只有文档可以保证。但事实并非如此。

您无法测试线程安全性。线程错误可能只会在负载或生产中出现。

此外,实施可以随时更改。安装Windows Update,Service Pack或新版本以及代码中断。

就我而言,这是一个明确的答案 - 你不能依赖它。此外,我不明白为什么即使对于少量数据,定期创建新实例也是一个问题。反序列化比实例化单个对象更加耗费CPU。创建(小)对象非常便宜。

答案 2 :(得分:1)

如果type包含静态私有不安全

说它就像滴答炸弹一样。我想没有人这样做。