序列化类到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
相关产品推荐
相关产品推荐

