DataContractJsonSerializer的静态实例-设计好坏

本文关键字:静态 实例 DataContractJsonSerializer | 更新日期: 2023-09-27 17:59:45

我有一个类,用于序列化和反序列化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次并发点击的网站调用。

DataContractJsonSerializer的静态实例-设计好坏

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

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

最后,您是否验证了创建序列化程序确实是一个问题(即,通过分析)?在您的场景中,它所花费的时间可能可以忽略不计,使用某种重用只会给代码增加不必要的复杂性。