抓狂的问题我的程序要用到从XML反序列化成一个类的功能,用的就是系统自带的System.Xml.Serialization中的XmlSerializer。一、症状程序第一遍运行的时候,运行到
XmlSerializer serializer = new XmlSerializer(typeof(T));
这一行语句的时候就卡机。不论你等到多长时间,都不会往下运行了。但是,奇葩之一是,你只要按一个
Ctrl+ALT+DEL,程序就自动往下运行了。我总不能告诉用户,第一次运行出现死机的时候,你按一下
ctrl+alt+del组合键吧?奇葩之二是,出现一次这样的症状之后,就没有这样的问题,再次调用此方法,非常顺畅。奇葩之三是,一模一样的程序,以前从来没有出现过。难道是VS2008还有什么隐含的编译选项?二、附源程序:using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace XYHIS
{
class XMLSrlz
{
public static T DeXMLSerialize<T>(string xmlString)
{
T cloneObject = default(T);
StringBuilder buffer = new StringBuilder();
buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));//这行程序
using (TextReader reader = new StringReader(buffer.ToString()))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
这一行语句的时候就卡机。不论你等到多长时间,都不会往下运行了。但是,奇葩之一是,你只要按一个
Ctrl+ALT+DEL,程序就自动往下运行了。我总不能告诉用户,第一次运行出现死机的时候,你按一下
ctrl+alt+del组合键吧?奇葩之二是,出现一次这样的症状之后,就没有这样的问题,再次调用此方法,非常顺畅。奇葩之三是,一模一样的程序,以前从来没有出现过。难道是VS2008还有什么隐含的编译选项?二、附源程序:using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using System.IO;
namespace XYHIS
{
class XMLSrlz
{
public static T DeXMLSerialize<T>(string xmlString)
{
T cloneObject = default(T);
StringBuilder buffer = new StringBuilder();
buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));//这行程序
using (TextReader reader = new StringReader(buffer.ToString()))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
}
解决方案 »
- 菜鸟提问:SQL语句能做到么?(查询条件有点特殊)
- 求一个只有年和月的控件(C#下)
- SqlCommand对象中的几种执行SQL语句的方法:ExecuteNonQuery,ExecuteReader,ExecuteScalar
- 上传文本文件到服务器?
- 动态控件
- datagridview checkbox 全选后,如何删除所选?
- winform 中,我编写了一个用户控件,如果使用
- 在大家说的网站上原版COPY的FTP代码,怎么上传下载功能都不行??急!!!
- 高手帮忙:VB.net 转换成 C#.net(ComboBox 控件添加到 Windows 窗体 DataGrid 控件)
- 以前的一个问题(使窗体成为系统模态窗体)
- 类似802.3帧通过TcpClient透明传输收发处理,求请一种高效的分段方法
- 文件被占用,求助---------------------------------
再把sb to到string
会快很多吗?
public static T DeXMLSerialize<T>(string xmlString)
{
T cloneObject = default(T); //buffer.Append(xmlString);
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(xmlString))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
程序真是杯具,用XmlSerializer performance关键字google一下,居然全世界人民都遇到这个问题。可恶的微软。
我是运行每一行代码,都写一条日志到本地文件跟踪到这的,绝对没有问题。而且,google出来的结果,很多人都碰到这个问题。
序列化内部其实是生成一个动态程序集,然后通过它生成XmlTypeMapping来实现的
那个程序集仅在第一次new XmlSerializer(typeof(T))时生成,后面再调用会进行重用
在生成的时候,可能会由于对象过于复杂或者包含有UnknowType的成员,.net会用反射去查找导致过高的CPU和内存调度,最终“死机”。
猜测Ctrl+ALT+DEL的taskmgr.exe的线程优先级比一般程序要高,可以打断这种调度在成员类型比较复杂时,可用XmlIncludeAttribute来指定成员的基类型
还是杯具,根据
http://stackoverflow.com/questions/1534810/xmlserializer-performance-issue-when-specifying-xmlrootattribute的建议,修改了程序还是不行了。To dongxinxi :
我定义的类只包含string,short[]和double三种类型啊。
http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer%28VS.95%29.aspx
折腾了一天,用了baidu,google来的各种方法,包括微软自己说HashTable还是解决问题.
无奈之下,只好使用第3方开发的XML转换工具了,有带源码的那.其实我是不喜欢用第3方工具的,不知道会不会有bug。