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

C# 反序列化包含无效数据类型的xml,c#,.net,serialization,xml-serialization,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 D

我有一个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 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>
这对我来说已经足够好了,但有时,我会得到一个XML文件,其中可能包含无效的数据类型(所谓“无效”,是指它应该映射到的对象属性的类型)。例如,如果我的XML文件如下所示:

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 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

显然,我无法将“abc”转换为对象的整数大小属性。当我尝试反序列化时,我看到一个InvalidOperationException,毫不奇怪,InnerException是“输入字符串格式不正确”。是否可以捕获此错误,为我的对象的属性使用默认值并继续反序列化XML文件的其余部分?如果没有,有人能告诉我,在反序列化过程中处理无效数据是否有公认的“最佳实践”?

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

您可以创建一个包含案例中有效XML定义的XML模式,然后首先使用XSD(XML模式定义)验证传入的XML(有关更多详细信息,请参见)


祝你好运

只需修复错误处理<代码>abc应该被拒绝,而不是转换。这并不是问题的答案。这不是一个好主意,但在某些情况下,您可能有不好的XML,需要捕获并处理该问题。