C#反序列化捕获&继续InvalidOperationException。怎么样?

时间:2014-10-19 06:53:02

标签: c# xml error-handling deserialization

我有xml文件:

<TestType>
  <Names>
    <Name>
      <ID>0</ID>
    </Name>
    <Name>
      <ID>1</ID>
    </Name>
    <Name>
      <ID>2WRONG</ID>
    </Name>
    <Name>
      <ID>3</ID>
    </Name>
  </Names>
</TestType>

2个简单的课程

public class Name
{
    [XmlElement("ID")]
    public int Id { get; set; }
}
[XmlRoot("TestType")]
[Serializable]
public class TestType
{
     public Collection<Name> Names { get; set; } 
}

并尝试反序列化xml文件:

private static void ReadXml()
        {

            var book = new TestType(){Names = new Collection<Name>()};
            var reader =
                new XmlSerializer(typeof(TestType));

            var file = new XmlTextReader(
                @"c:\temp\stest.xml");
            try
            {
                book = (TestType)reader.Deserialize(file);
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine(ex.InnerException.Message);
            }
            file.Close();
            Console.WriteLine(book.Names.Count);
            Console.ReadKey();
        }

正如预期的默认行为,反序列化抛出InvalidOperationException,“无效的输入字符串”在元素上,其中id = 2WRONG(是字符串,而不是int),并且反序列化过程中止。在book.Names中收集零元素。

我如何做到这一点:

1)反序列化过程不要在错误输入时中止,他的抛出异常,我抓住他并继续处理。 2)反序列化后的book.Names集合包含所有正确的元素(在这种情况下为(id = 0,1,3))

PS:我尝试混合验证和反序列化,是的。我这样做是因为反序列化非常快,这对我来说非常重要。如果我这样做错了 - 请告诉我。

1 个答案:

答案 0 :(得分:0)

我一直都是在几个月前,当我试图弄清楚xml docs的序列化/反序列化是如何工作的时候。

在将信息反序列化为代码时,您有一些选择。

1-从XML传递到简单的类

根据您尝试阅读的文档创建一个包含propreties的类。这样,您就可以确切地知道您想要的信息。以下是如何使用TextReader和XmlSerializer

的示例
MyClass object = new MyClass();
string filename =  "C/path/to/file.xml";
TextReader fileReader =  new StreamReader(filename); // the constructor of textreader does not take parameters and inherits from streamreader class 
XmlSerializer serializer= new  XmlSerializer(typeOf(MyClass));
//Deserialize the xml document 
object = (MyClass) serializer.Deserialize(reader);
object.Close(); //close the stream of data!

2-使用LINQ 在进行不同类型的查询时,LINQ是一个非常强大的工具。这个过程高效而干净。 我将不得不向您推荐这篇文章,其中有一个很好的例子:How to deserialize xml using Linq?

3-如果选项1和2对您来说还不够,我建议您看一下:How to Deserialize XML document

希望我能帮助你一点! :)