C#XmlSerializer BindingFailure

时间:2010-02-05 18:32:12

标签: c# .net visual-studio-2008 xmlserializer

我使用XmlSerializer在一行代码上获得了一个BindingFailure:

XmlSerializer s = new XmlSerializer(typeof(CustomXMLSerializeObject));
  

具有显示名称CustomXMLSerializeObject.XmlSerializers'的程序集无法加载到ID为1的AppDomain的“LoadFrom”绑定上下文中。失败的原因是:System.IO.FileNotFoundException:无法加载文件或程序集XMLSerializeObject。 XmlSerializers,Version = 1.4.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。系统找不到指定的文件。

错误很长,继续解释预绑定状态信息以及它试图找到文件的位置。

我想要解析的自定义对象相对简单 - 只是一堆私有整数和具有公共访问器的字符串。我有一个私有变量,它是另一个自定义的可序列化类,但是它只有私有字符串,其中包含公共访问器。

尴尬的部分?这只在我反序列化时发生。当我序列化对象时,那行代码运行正常。它工作正常,对象被反序列化并完美填充。不要注意任何性能损失或加载时间过长。

这个警告究竟是什么(不是错误或异常,之后程序运行良好)?为什么会这样?如何在不简单地禁用警告的情况下阻止它?

4 个答案:

答案 0 :(得分:57)

根据Strange XmlSerializer error

  

这个例外是其中的一部分   XmlSerializer的正常运行。它   预计会被抓住   在Framework代码中处理。   只需忽略它并继续。如果它   在调试过程中困扰你,设置   Visual Studio调试器只能停止   未处理的例外而非全部   异常。

它可能是由您选择监控的异常引起的。

您能告诉我您的异常是如何设置的:Debug - >例外

如果取消选中Managed Debugging Assistants下BindingFailure的“Thrown”复选框,则异常应该消失。或者,如果你不想这样做,你可以继续,因为这个例外是设计

答案 1 :(得分:39)

使用以下方法构建xmlSerializer实例将解决问题:

XmlSerializer s = XmlSerializer.FromTypes(new[] { typeof(CustomXMLSerializeObject) })[0];

然后,您不需要关闭异常处理。

答案 2 :(得分:4)

根据MS VS 2010 Feedback,这是它的设计方式。为了防止此异常并防止在运行时执行期间减慢,您需要生成XML Serializer程序集。

我可以找到三种工具:Microsoft SGenXGenPlusMvp.Xml.XGen。不幸的是,自2007年以来,这些帖子都没有更新过。

答案 3 :(得分:0)

好吧我找到了解决方案。我永远不能接受将异常作为答案。只是看起来有点错误......

似乎正在发生的事情是,在以前的程序集或当前程序集的先前版本中,某些引用是在外部使用的。即使你的代码可能早已放弃了那些引用,但在程序集中搜索的名称仍然是某些神秘的东西。

转到AssemblyInfo.cs文件并找到ThemeInfo:

[assembly: ThemeInfo(
ResourceDictionaryLocation.ExternalAssembly, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

将第一个位置更改为“无”:

[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page, 
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries))]

并保持您的例外开启!我将把这个答案发给这种类似性质的各种问题。