反序列化包含无效数据类型的xml

时间:2012-10-10 13:41:57

标签: c# .net serialization xml-serialization

我有一个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文件的其余部分?如果没有,任何人都可以告诉我,在反序列化过程中是否存在通常被认为是处理无效数据的“最佳实践”?

1 个答案:

答案 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)。

祝你好运!