XmlSerializer.Deserialize方法可以抛出哪些类型的异常?

时间:2009-08-25 04:28:20

标签: c# .net serialization xml-serialization

对于这种方法XmlSerializer.Deserialize,可能抛出什么类型的异常? XmlExceptionInvalidOperationException?我没有从这个方法中找到任何异常描述信息。我的问题是这种方法可以抛出什么样的异常?

http://msdn.microsoft.com/en-us/library/dsh84875.aspx

我使用的是VSTS2008 + C#+ .Net。

提前谢谢, 乔治

3 个答案:

答案 0 :(得分:20)

主要看起来像InvalidOperationException

如果您查看每个重载的文档,它将为您提供更多详细信息。例如,请参阅XmlSerializer.Deserialize Method (XmlReader)

InvalidOperationException将包含有关其InnerException属性中特定错误的更多详细信息。

编辑:

XmlSerializer.Deserialize Method (XmlSerializationReader)可以抛出NotImplementedException,但它是一个内部API,并不代表你的代码使用,所以不要担心。

编辑2:

此代码:

var ms = new System.IO.MemoryStream();
var deser = new System.Xml.Serialization.XmlSerializer(typeof(string));
deser.Deserialize(ms);

抛出:

System.InvalidOperationException: There is an error in XML document (0, 0). ---
System.Xml.XmlException: Root element is missing.
  at System.Xml.XmlTextReaderImpl.Throw(Exception e)
... <snip> ...

所以看起来框架总是会抛出一个InvalidOperationException

真的,除非你担心错误地捕获ThreadAbortException之类的异常,否则你可能最安全地捕获所有例外......

编辑3:

使用ReflectorDeserialize(stream)方法使用XmlTextReader读取流并调用XmlSerializer.Deserialize Method (XmlReader, String)。该方法会导致错误InvalidOperationException(根据文档)。

编辑4:

如果Deserialize(stream)为空,

NullReferenceException也可以抛出stream,因为它会调用XmlTextReader(Stream)构造函数。

答案 1 :(得分:7)

  

XmlSerializer的例外

     

首先,诊断这些问题的根源可能很棘手,   因为XmlSerializer的例外似乎没有提供   关于其发生原因的大量信息;至少,他们   不要在开发人员通常的位置提供信息   看起来。

     

在大多数情况下,Serialize,Deserialize甚至是XmlSerializer   构造函数抛出一个相当通用的System.InvalidOperationException   发生错误时此异常类型可能出现在许多地方   .NET Framework;它根本不是特定于XmlSerializer的。至   更糟糕的是,异常的Message属性只会产生很大的影响   通用信息。

可以在文档Troubleshooting Common Problems with the XmlSerializer上找到关于XmlSerializer中的异常的这个以及其他非常方便的提示。

答案 2 :(得分:1)

George,因为.NET中没有异常契约,最好的做法是捕获您可能想要进行特殊处理的任何特定异常,但也要有一个能够适当处理所有失败的全能异常处理程序。

我已经使用内置的.NET序列化实现了几个XML序列化解决方案,并且在所有情况下都使用了catch-all except块,它解决了捕获异常的不足之处,添加了所有错误消息和异常类类型到一个字符串消息。这样做总能提供足够的信息来调试任何序列化问题。

在相关的说明中,我通常做的是添加一个调试日志级别,它将完整的xml记录到我的应用程序的日志中,以便我可以检查它以尝试找出在调试冻结问题时出错的地方。< / p>