You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

反序列化XML字符串遇FileNotFoundException,清理临时文件夹可临时恢复

分析与排查方向

首先,这个问题的核心大概率和XmlSerializer的动态程序集生成机制有关——.NET的XmlSerializer在首次处理某个类型时,会自动生成一个序列化/反序列化的临时程序集,并存放在系统临时目录(通常是%TEMP%\Temporary ASP.NET Files或者%TEMP%下的随机文件夹)。重启电脑后,这些临时程序集可能被系统清理、损坏,或者权限出现问题,导致反序列化时找不到依赖的程序集文件,从而抛出FileNotFoundException。

下面是具体的排查和解决方向:

1. 验证临时目录的权限与文件状态

  • 打开系统临时目录(按Win+R输入%TEMP%回车),检查是否存在以XmlSerializer相关命名开头的.dll/.pdb文件。重启后出现问题时,看看这些文件是否缺失或者无法访问。
  • 确保当前运行程序的用户对临时目录拥有完全控制权限——有时候系统权限变更会导致程序无法读取或生成临时程序集。

2. 预生成序列化程序集(彻底解决动态生成问题)

动态生成临时程序集是问题的根源,你可以用sgen.exe工具预生成对应类型的序列化程序集,这样运行时就不会再动态生成临时文件了:

  1. 打开Visual Studio的开发者命令提示符
  2. 执行命令:sgen.exe /assembly:Reporting.DataModel.dll(替换成你的程序集路径)
  3. 生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:23:07