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

问题描述

| 我有一个用于在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个并发点击。     

解决方法

        正如Alex所提到的,您可能会遇到问题-该类的文档指出它不是线程安全的(至少不是用于读取/写入对象的方法)。通过快速查看反射器,看来串行化实际上可以工作(假设您不是在不同线程中同时序列化同一对象,那是蠕虫的全新罐头),但是既然如此,作为内部实现的详细信息,有可能在新版本的框架中,类进行了某些更改(即优化),并且不再适用。 您可以考虑的一个选择是拥有一个可重用的序列化程序池。您的代码将从池中获取一个序列化器,使用它进行序列化/反序列化,然后将其返回到池中。这样,您将获得重用实例的好处,但是没有在多个线程中使用线程不安全类的风险。 最后,您是否验证了序列化程序的创建确实存在问题(即通过分析)?在您的方案中,可能花费的时间可以忽略不计,并且使用某种重用方式只会给代码增加不必要的复杂性。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...