XmlSerializer(Type type, Type[] extraTypes) 内存泄漏
2016-04-06 10:01
344 查看
在使用XmlSerializer进行序列化或者反序列的时候,对于下面的两个构造方法
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
为了提高性能,XML 序列化基础结构将动态生成程序集,以序列化和反序列化指定类型。此基础结构将查找并重复使用这些程序集。
但是对于XmlSerializer(Type type, Type[] extraTypes) 等其他的构造函数,则会生成同一程序集的多个版本,且绝不会被卸载,这将导致内存泄漏和性能降低。
为了解决这个问题代码如下,仅供参考:
XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
为了提高性能,XML 序列化基础结构将动态生成程序集,以序列化和反序列化指定类型。此基础结构将查找并重复使用这些程序集。
但是对于XmlSerializer(Type type, Type[] extraTypes) 等其他的构造函数,则会生成同一程序集的多个版本,且绝不会被卸载,这将导致内存泄漏和性能降低。
为了解决这个问题代码如下,仅供参考:
static Hashtable ht = new Hashtable(); /// <summary> /// 将指定的对象序列化为XML格式的字符串并返回。 /// </summary> /// <param name="o">待序列化的对象</param> /// <returns>返回序列化后的字符串</returns> public static string Serialize(Object o, Type[] types = null) { if (o != null) { string xml = ""; XmlSerializer serializer = null; try { if (types != null) { string names = ""; for (int i = 0; i < types.Length; i++) { names = names + types[i].FullName; } XmlSerializerFactory factory = new XmlSerializerFactory(); if (ht.ContainsKey(names)) { serializer = (XmlSerializer)ht[names]; } else { serializer = factory.CreateSerializer(o.GetType(), types); ht.Add(names, serializer); } // serializer = new XmlSerializer(o.GetType(), types); } else { serializer = new XmlSerializer(o.GetType()); } using (MemoryStream mem = new MemoryStream()) { using (XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8)) { writer.Formatting = Formatting.Indented; XmlSerializerNamespaces n = new XmlSerializerNamespaces(); n.Add("", ""); serializer.Serialize(writer, o, n); mem.Seek(0, SeekOrigin.Begin); using (StreamReader reader = new StreamReader(mem)) { xml = reader.ReadToEnd(); } } } types = null; serializer = null; } catch { xml = ""; serializer = null; } return xml; } else { return ""; } }
相关文章推荐
- Ajax之数据连接信息捕获
- SharePoint2013 上传文件到文档库
- spring框架学习(四)自动装配
- Linux下获取进程状态
- python 安装 setuptools Compression requires the (missing) zlib module 的解决方案
- 统计无符号整型数的二进制码中‘1’的个数
- web前端工程师
- DevExpress RibbonForm的标题栏(Title Caption)中文显示不全
- Android onTouch事件传递机制
- MyEclipse 引用 jar外包的方法
- QT5 OPenGL(二,平面图形上色)
- 把byte[]转换为String
- php 算法之切割数组,不用array_chunk(),算法之二,取数组的差值,不用array_diff()
- 浏览器强制使用360极速模式
- web前端工程师
- web项目启动初始化java Demo
- 好马应不应该吃回头草?
- Visual Studio 2015编译EncodePointer函数的问题
- Quartz 2D编程指南(1) - 概览
- jquery树形控件Ztree 使用