3

我有一个 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 文件的其余部分?如果没有,谁能告诉我在反序列化过程中处理无效数据是否存在普遍认为的“最佳实践”?

4

1 回答 1

3

您需要做的是在反序列化之前验证传入的 XML。基本上,您希望避免处理格式错误的 XML。验证后,反序列化器至少可以确保所有传入的 XML 都是可反序列化的。

您可以创建一个包含有效 XML 定义的 XML 模式,然后首先使用 XSD(XML 模式定义)验证传入的 XML(另请参见http://www.codeguru.com/csharp/csharp/cs_data /xml/article.php/c6737/Validation-of-XML-with-XSD.htm了解更多详细信息)。

祝你好运!

于 2012-10-10T13:45:51.313 回答