我有一个XML文件,我需要将其反序列化为类似于这个的对象:
public class TestObject
{
public string Name { get; set; }
public int Size { get; set; }
public TestObject()
{
Name = string.Empty;
Size = 0;
}
}
我的反序列化方法如下所示:
private TestObject DeserializeConfiguration(string xmlFileName)
{
XmlSerializer deserializer = new XmlSerializer(typeof(TestObject));
TextReader textReader = new StreamReader(xmlFileName);
TestObject testObj = (TestObject)deserializer.Deserialize(textReader);
textReader.Close();
return testObj;
}
这对我来说运行得很好但有时候,我得到的XML文件可能包含无效的数据类型(“无效”,我的意思是它应该映射到的对象属性的类型)。例如,如果我的XML文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Orion</Name>
<Size>abc</Size>
</TestObject>
显然我无法将“abc”转换为我的对象的整数Size属性。当我尝试反序列化时,我看到一个InvalidOperationException,并且毫不奇怪,InnerException是“输入字符串格式不正确”。是否可以捕获此错误,对我的对象的该属性使用默认值并继续反序列化XML文件的其余部分?如果没有,任何人都可以告诉我,在反序列化过程中是否存在通常被认为是处理无效数据的“最佳实践”?
答案 0 :(得分:4)
您需要做的是在反序列化之前验证传入的XML。基本上,您希望避免处理格式错误的XML。验证后,反序列化器至少可以确保所有传入的XML都可以反序列化。
您可以创建一个XML Schema,其中包含您的案例中有效XML的定义,然后首先使用XSD(XML架构定义)验证传入的XML(有关详细信息,另请参阅http://www.codeguru.com/csharp/csharp/cs_data/xml/article.php/c6737/Validation-of-XML-with-XSD.htm)。
祝你好运!