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

序列化类到XML时遇System.IO.FileNotFoundException,生成序列化DLL仍报错

解决Xml序列化时FileNotFoundException问题

先排查基础问题

  • 检查生成的XmlSerializer DLL命名:必须是[你的程序集名].XmlSerializers.dll,和目标DLL完全同名前缀,注意Linux/macOS下大小写敏感。
  • 确认架构一致:目标DLL是x64/x86/Any CPU,生成的序列化DLL也要对应,不能混合架构。
  • 生成命令是否正确:用.NET Core的dotnet xmlserializer generate命令,指定正确的项目路径或DLL路径,比如dotnet xmlserializer generate -p YourProject.csproj。

优化序列化代码(解决空文件+异常处理)

原来的代码未使用using语句,异常时文件流无法正确关闭,导致空文件。同时增加动态生成序列化程序集的分支,避开预生成DLL找不到的问题:

bool success = true;
try
{
    // 用using自动释放资源,避免异常时文件损坏/空文件
    using (var fs = new FileStream(_feedpath, FileMode.Create))
    {
        var settings = new XmlWriterSettings
        {
            Encoding = Encoding.UTF8,
            Indent = true,
            DoNotEscapeUriAttributes = false
        };
        
        using (var writer = XmlWriter.Create(fs, settings))
        {
            var serializer = new XmlSerializer(typeof(Rss));
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            serializer.Serialize(writer, mrss, ns);
        }
    }
    originalMrss = mrss.Clone();
}
catch (FileNotFoundException excp)
{
    if (excp.Message.Contains("XmlSerializer"))
    {
        // 预生成DLL找不到时,让.NET动态生成序列化程序集
        var serializer = XmlSerializer.FromTypes(new[] { typeof(Rss) })[0];
        using (var fs = new FileStream(_feedpath, FileMode.Create))
        using (var writer = XmlWriter.Create(fs, new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true }))
        {
            var ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            serializer.Serialize(writer, mrss, ns);
        }
        originalMrss = mrss.Clone();
    }
    else
    {
        success = false;
    }
}
catch (Exception)
{
    success = false;
    // 按需添加其他异常日志或处理逻辑
}

额外验证步骤

  • 清理重建:删除项目的bin、obj目录,重新编译目标项目,再重新生成XmlSerializer DLL。
  • 确认运行目录:程序实际运行时,XmlSerializer DLL要在当前工作目录或程序集加载路径下,不要只放在编译输出目录。
  • 测试动态生成分支:如果预生成始终有问题,直接用XmlSerializer.FromTypes的方式,首次序列化会慢一点,但能彻底避开DLL找不到的问题。

内容的提问来源于stack exchange,提问作者rrirower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:23:26