DataContractJsonSerializer的静态实例 - 设计好坏?

时间:2011-06-21 20:16:37

标签: c# asp.net concurrency static static-variables

我有一个类,用于在ASP.NET应用程序中序列化和反序列化业务对象。

该类包含此静态变量:

private static DataContractJsonSerializer m_serializer = new DataContractJsonSerializer(typeof(MyBusinessObject));

...和类中的两个静态方法:

public static string SerializeJson(MyBusinessObject bo);

public static MyBusinessObject DeserializeJson(string json);

在这些方法中,我使用静态DataContractJsonSerializer对象(m_serializer)来执行序列化和反序列化。这样,我不需要为每次调用实例化一个DataContractJsonSerializer实例。

以这种方式使用静态变量是否正确?

如果我在序列化/反序列化代码上获得大量点击,我会遇到任何问题吗?

它将从网站调用,每秒获得100次并发命中。

1 个答案:

答案 0 :(得分:2)

正如Alex提到的,你可以遇到问题 - 该类的文档声明它不是线程安全的(至少不是用于读/写对象的方法)。通过快速查看反射器,似乎序列化实际上可以工作(假设您不是在不同的线程中同时序列化同一个对象,这是一个全新的蠕虫),但由于它是一个内部实现细节,在框架的新版本中,类可能会有一些变化(即优化),而且不再适用。

您可以考虑的一个选项是拥有可以重复使用的序列化程序的。您的代码将从池中获取一个序列化程序,使用它来序列化/反序列化,然后将其返回到池中。这样您就可以获得重用实例的好处,但没有在多个线程中使用线程不安全类的风险。

最后,您是否已验证序列化程序的创建确实存在问题(即通过分析)?在您的场景中,所花费的时间可能是微不足道的,并且使用某种重用只会给代码添加不必要的复杂性。