为了账号安全,请及时绑定邮箱和手机立即绑定

XmlSerializer在构造函数中给出FileNotFoundException

XmlSerializer在构造函数中给出FileNotFoundException

C#
胡子哥哥 2019-09-19 09:33:03
当我尝试序列化类型时,我一直在使用的应用程序失败。像这样的陈述XmlSerializer lizer = new XmlSerializer(typeof(MyType));生产:System.IO.FileNotFoundException occurred  Message="Could not load file or assembly '[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified."   Source="mscorlib"   FileName="[Containing Assembly of MyType].XmlSerializers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"   FusionLog=""   StackTrace:        at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)        at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)我没有为我的班级定义任何特殊的序列化器。我该如何解决这个问题?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

就像Martin Sherburn所说,这是正常的行为。XmlSerializer的构造函数首先尝试查找名为[YourAssembly] .XmlSerializers.dll的程序集,该程序集应包含用于序列化类型的生成类。由于尚未生成此类DLL(默认情况下不是这样),因此抛出FileNotFoundException。当发生这种情况时,XmlSerializer的构造函数捕获该异常,并且XmlSerializer的构造函数在运行时自动生成DLL(这是通过在计算机的%temp%目录中生成C#源文件,然后使用C#编译器编译它们来完成的)。对于相同类型的XmlSerializer的其他构造将仅使用已经生成的DLL。

更新:从.NET 4.5开始,XmlSerializer不再执行代码生成,也不使用C#编译器执行编译,以便在运行时创建序列化程序程序集,除非通过设置配置文件设置(useLegacySerializerGeneration)显式强制执行。此更改消除了依赖性csc.exe并提高了启动性能。来源:.NET Framework 4.5自述文件,第1.3.8.1节。

该异常由XmlSerializer的构造函数处理。您无需自己做任何事情,只需单击“继续”(F5)继续执行您的程序,一切都会好的。如果您对停止执行程序并弹出异常帮助程序的异常感到困扰,则可以关闭“Just My Code”,或者将FileNotFoundException设置为在抛出时执行,而不是在“User-未处理”。

要启用“Just My Code”,请转到工具>>选项>>调试>>常规>>启用我的代码。要在抛出FileNotFound时关闭执行中断,请转到Debug >> Exceptions >> Find >> enter'FileNotFoundException'>>取消选中System.IO.FileNotFoundException中的'Thrown'复选框。


查看完整回答
反对 回复 2019-09-19
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

有一个解决方法。如果你使用

XmlSerializer lizer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];

它应该避免这种例外。这对我有用。

警告: 不要多次使用,否则会有内存泄漏

如果你使用这种方法XmlSerializer多次创建同一类型的实例,你会像疯了一样泄漏内存!

这是因为此方法绕过了提供者XmlSerializer(type)XmlSerializer(type, defaultNameSpace)构造函数(所有其他构造函数也绕过缓存)的内置缓存。

如果您使用任何方法来创建不通过这两个构造函数的XmlSerializer,您必须实现自己的缓存,否则您将出血。


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 697 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信