反序列化XML字符串遇FileNotFoundException,清理临时文件夹可临时恢复
分析与排查方向
首先,这个问题的核心大概率和XmlSerializer的动态程序集生成机制有关——.NET的XmlSerializer在首次处理某个类型时,会自动生成一个序列化/反序列化的临时程序集,并存放在系统临时目录(通常是%TEMP%\Temporary ASP.NET Files或者%TEMP%下的随机文件夹)。重启电脑后,这些临时程序集可能被系统清理、损坏,或者权限出现问题,导致反序列化时找不到依赖的程序集文件,从而抛出FileNotFoundException。
下面是具体的排查和解决方向:
1. 验证临时目录的权限与文件状态
- 打开系统临时目录(按Win+R输入
%TEMP%回车),检查是否存在以XmlSerializer相关命名开头的.dll/.pdb文件。重启后出现问题时,看看这些文件是否缺失或者无法访问。 - 确保当前运行程序的用户对临时目录拥有完全控制权限——有时候系统权限变更会导致程序无法读取或生成临时程序集。
2. 预生成序列化程序集(彻底解决动态生成问题)
动态生成临时程序集是问题的根源,你可以用sgen.exe工具预生成对应类型的序列化程序集,这样运行时就不会再动态生成临时文件了:
- 打开Visual Studio的开发者命令提示符
- 执行命令:
sgen.exe /assembly:Reporting.DataModel.dll(替换成你的程序集路径) - 生成的
Reporting.DataModel.XmlSerializers.dll会和原程序集在同一目录,把它一起部署到项目中即可。
或者在项目属性中开启“生成序列化程序集”:右键项目→属性→生成→勾选“生成序列化程序集”(选择“On”),这样编译时会自动生成对应的序列化程序集。
3. 修改反序列化的编码处理(排除编码适配问题)
虽然你确认XML是有效的,但注意到XML声明是utf-16编码,StringReader默认会以UTF-16读取字符串,但可以尝试显式用编码匹配的方式读取,避免潜在的编码适配问题:
public T Deserialize<T>(string xml) { try { XmlSerializer ser = new XmlSerializer(typeof(T), GetExtraTypes()); File.AppendAllText(@"C:\Temp\Xml.txt", xml); // 显式用UTF-16编码的MemoryStream来读取 using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(xml))) using (var reader = new StreamReader(ms, Encoding.Unicode)) { return (T)ser.Deserialize(reader); } } catch (Exception e) { File.AppendAllText(@"C:\Temp\Exception.txt", e.ToString()); throw; } }
4. 深入追踪动态程序集的生成过程
如果Process Monitor之前没抓到有用信息,可以尝试:
- 过滤Process Monitor的操作,只关注
csc.exe(生成临时程序集的编译器)和XmlSerializer相关的文件操作,看生成程序集时是否有报错,或者文件路径是否异常。 - 在代码中添加日志,输出
XmlSerializer生成的程序集路径(通过反射获取):
var ser = new XmlSerializer(typeof(T), GetExtraTypes()); var generatedAssembly = ser.GetType().GetField("_generatedAssembly", BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(ser) as Assembly; if (generatedAssembly != null) { File.AppendAllText(@"C:\Temp\AssemblyPath.txt", generatedAssembly.Location); }
这样可以看到程序集具体存放在哪里,重启后检查该路径下的文件是否存在。
5. 检查系统/第三方的临时文件清理策略
有些系统工具(比如Windows磁盘清理)或者第三方优化软件,会在重启后自动清理临时目录的文件,可能误删了XmlSerializer生成的程序集。你可以检查这些工具的清理规则,排除相关的临时文件。
内容的提问来源于stack exchange,提问作者MOSA
相关产品推荐
相关产品推荐

