当尝试使用 将类型(List<T>
T 是用 XmlRootAttribute 标记的类的泛型)序列化为 XMLXmlSerializer
时,FileNotFoundException
会抛出 a(有时)并且序列化失败。
似乎XmlSerializer
试图在运行应用程序的用户的 Temp 文件夹中创建一个具有随机文件名的临时文件,但该文件以某种方式被删除。
有人见过这个吗?任何解决方法?
当尝试使用 将类型(List<T>
T 是用 XmlRootAttribute 标记的类的泛型)序列化为 XMLXmlSerializer
时,FileNotFoundException
会抛出 a(有时)并且序列化失败。
似乎XmlSerializer
试图在运行应用程序的用户的 Temp 文件夹中创建一个具有随机文件名的临时文件,但该文件以某种方式被删除。
有人见过这个吗?任何解决方法?
XmlSerializer 通过生成代码来执行序列化/反序列化并将其存储在临时程序集中来工作。(这种方法为重复序列化/反序列化提供了良好的性能,但(传统上)第一次运行的性能令人震惊)
为了帮助减轻令人震惊的性能,从 VS2005 开始(以及更早使用鲜为人知的技术),您可以在构建时显式创建序列化程序集并将其与您的主程序集一起发布。
如果您不创建/发送序列化程序集,那么框架在寻找它时往往会抛出异常,尽管通常它会捕获异常,动态构建程序集并继续处理。如果您在调试器下运行,但设置了“break-on-throw”,那么在框架内部深处抛出 FileNotFound 异常可能会有点令人担忧。
您确定FileNotFound 异常与您看到的序列化失败直接相关吗?您是否尝试过明确包含序列化程序集?
如果您使用 Visual Studio 构建,项目属性中有一个有趣的选项。在构建选项卡上,您可以选择生成序列化程序集(是、否、自动)。如果我没记错的话,我没有成功地用“是”生成这个程序集来摆脱那个异常。但是一旦我觉得将选项设置为“否”会导致构建不尝试搜索这样的程序集,因此不再有令人沮丧的 FileNotFound-Exception。无论如何,正如您已经说过的,例外更多的是外观问题。您可以考虑抑制它(在 Visual Studio 中通过 Debug/Exceptions 配置),至少在处理它的情况下。
这里的最后一种可能性是 XML 序列化运行时中存在一个大问题。这些在几年前更常见,但可能还有一些。可能发生的情况是,给定 C# 或 VB(或其他)代码上完全合法的 XML 序列化标记,为该类型创建 XmlSerializer 会导致为 JIT 编译的序列化程序集创建非法代码。编译会窒息而死,然后加载程序集会抛出。通常使用 rfuieuy267.dll 或类似的文件名。
你可以说出一个秘密的咒语来告诉 XmlSerialization 引擎保留它生成的 .cs 代码,但我不记得它现在是什么了。它没有记录在案;我只有在与 MS 工程师一起调试其中一个问题时才知道它。但我敢打赌,你可以在 googlespace 中找到它。