尝试使用List<T>
将类型(通用XmlSerializer
,其中T是使用XmlRootAttribute标记的类)序列化为XML时,会抛出FileNotFoundException
(有时)并且序列化失败。
似乎XmlSerializer
尝试在运行应用程序的用户的Temp文件夹中创建一个随机文件名的临时文件,但文件会以某种方式被删除。
有人见过这个吗?任何解决方法?
答案 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配置),至少在它被处理的情况下。
答案 2 :(得分:0)
最后一种可能性是XML Serialization运行时中存在很大的问题。这些在几年前更常见,但仍有可能还有一些。可能发生的情况是,在C#或VB(或其他)代码上给出完全合法的XML序列化标记,为该类型创建XmlSerializer会导致为JIT编译的序列化程序集创建非法代码。编译会窒息而死,然后加载程序集就会抛出。通常使用rfuieuy267.dll或类似的文件名。
有一个秘密的咒语,你可以告诉XmlSerialization引擎保留它生成的.cs代码,但我不记得它现在是什么。它没有记录;我只是在与MS工程师一起调试其中一个问题时才了解到它。但我敢打赌你可以在googlespace找到它。