3 回答
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'复选框。
TA贡献1906条经验 获得超3个赞
有一个解决方法。如果你使用
XmlSerializer lizer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];
它应该避免这种例外。这对我有用。
警告: 不要多次使用,否则会有内存泄漏
如果你使用这种方法XmlSerializer
多次创建同一类型的实例,你会像疯了一样泄漏内存!
这是因为此方法绕过了提供者XmlSerializer(type)
和XmlSerializer(type, defaultNameSpace)
构造函数(所有其他构造函数也绕过缓存)的内置缓存。
如果您使用任何方法来创建不通过这两个构造函数的XmlSerializer,您必须实现自己的缓存,否则您将出血。
- 3 回答
- 0 关注
- 757 浏览
添加回答
举报