使用XmlSerializer时出现FileNotFound异常

时间:2008-11-30 16:24:01

标签: .net xml-serialization

尝试使用List<T>将类型(通用XmlSerializer,其中T是使用XmlRootAttribute标记的类)序列化为XML时,会抛出FileNotFoundException(有时)并且序列化失败。

似乎XmlSerializer尝试在运行应用程序的用户的Temp文件夹中创建一个随机文件名的临时文件,但文件会以某种方式被删除。

有人见过这个吗?任何解决方法?

3 个答案:

答案 0 :(得分:2)

XmlSerializer通过生成代码来进行序列化/反序列化,并将其存储在临时程序集中。 (这种方法为重复序列化/反序列化提供了良好的性能,但(传统上)第一次运行的性能非常糟糕)

为了帮助缓解令人震惊的性能,从VS2005开始(以及之前使用不太知名的技术),您可以在构建时显式创建序列化程序集并将其与主程序集一起发送。

如果创建/发送序列化程序集,那么框架在查找时往往会抛出异常,但通常会捕获异常,动态构建程序集,继续做事。如果你在调试器下运行,但是设置了'break-on-throw',那么将FileNotFound异常置于框架内部深处可能有点令人担忧。

确定 FileNotFound异常与您看到的序列化失败直接相关吗?您是否尝试过明确地包含序列化程序集?

答案 1 :(得分:2)

如果使用Visual Studio构建,则在项目属性中有一个有趣的选项。 在Build-tab上,您可以选择Generate Serialization Assemby(Yes,No,Auto)。 如果我没记错的话,我没有成功用“是”生成这个程序集来摆脱那个异常。但是,一旦我认为将选项设置为“否”导致构建不尝试搜索这样的程序集,那么就不再有令人沮丧的FileNotFound-Exception了。 无论如何,正如你已经说过的那样,例外更像是一个宇宙问题。您可以考虑禁止它(通过Visual Studio中的Debug / Exceptions配置),至少在它被处理的情况下。

编辑:The option is only evaluated under certain circumstances, for a final solution see this question (and its answers)

答案 2 :(得分:0)

最后一种可能性是XML Serialization运行时中存在很大的问题。这些在几年前更常见,但仍有可能还有一些。可能发生的情况是,在C#或VB(或其他)代码上给出完全合法的XML序列化标记,为该类型创建XmlSerializer会导致为JIT编译的序列化程序集创建非法代码。编译会窒息而死,然后加载程序集就会抛出。通常使用rfuieuy267.dll或类似的文件名。

有一个秘密的咒语,你可以告诉XmlSerialization引擎保留它生成的.cs代码,但我不记得它现在是什么。它没有记录;我只是在与MS工程师一起调试其中一个问题时才了解到它。但我敢打赌你可以在googlespace找到它。