XmlSerializer在构造函数中给出FileNotFoundException

当我尝试序列化类型时,我一直在使用的应用程序失败。

像这样的陈述

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)

我没有为我的班级定义任何特殊的序列化器。

我该如何解决这个问题?


胡子哥哥
浏览 759回答 3
3回答

慕工程0101907

就像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'复选框。

一只名叫tom的猫

有一个解决方法。如果你使用XmlSerializer lizer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];它应该避免这种例外。这对我有用。警告: 不要多次使用,否则会有内存泄漏如果你使用这种方法XmlSerializer多次创建同一类型的实例,你会像疯了一样泄漏内存!这是因为此方法绕过了提供者XmlSerializer(type)和XmlSerializer(type, defaultNameSpace)构造函数(所有其他构造函数也绕过缓存)的内置缓存。如果您使用任何方法来创建不通过这两个构造函数的XmlSerializer,您必须实现自己的缓存,否则您将出血。
打开App,查看更多内容
随时随地看视频慕课网APP