首页 > 解决方案 > 仅将 XML 反序列化为精确的类

问题描述

有没有办法强制 XML Deserialize 仅转换为完全匹配的类对象,如果不完全匹配则抛出异常(或错误)?

以下代码将成功导入所有 3 个 xml 文件:

using System.IO;
using System.Windows;
using System.Xml.Serialization;

namespace XmlDeserialize
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {           

            Person data;

            XmlSerializer xs = XmlSerializer.FromTypes(new[] { typeof(Person) })[0];

            using (StreamReader reader = new StreamReader(Directory.GetCurrentDirectory() + "\\exact.xml"))
            {
                data = (Person)xs.Deserialize(reader);
            }

            using (StreamReader reader = new StreamReader(Directory.GetCurrentDirectory() + "\\reduced.xml"))
            {
                data = (Person)xs.Deserialize(reader);
            }

            using (StreamReader reader = new StreamReader(Directory.GetCurrentDirectory() + "\\extended.xml"))
            {
                data = (Person)xs.Deserialize(reader);
            }
        }
    }


    public class Person
    {
        public string Name;
        public int Age;            
    }
}

确切的.xml

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>MyName</Name>
    <Age>9999</Age>
</Person>

exact.xml 完全适合,因此应该可以毫无问题地对其进行反序列化

减少的.xml

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>MyName</Name>
</Person>

老实说,我预计使用reduce.xml会收到错误,但它会被反序列化而没有问题。我认为如果“Age”不可为空(int?)我将收到一个错误,而不是 int 的默认值。特别是当记住以下代码将导致编译器错误时。

int x;
MessageBox.Show("x: " + x); //Error: Use of unassigned local variable 'x'

因此,成功的反序列化对我来说很奇怪,但在某种程度上可以解释......

但我完全无法理解的是,使用以下 xml 文件时我没有收到错误:

扩展的.xml

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>MyName</Name>
    <Age>9999</Age>
    <Address>MyAddress</Address>
</Person>

反序列化完全忽略了他无法将“地址”分配给任何类属性......

是否可以强制进行精确解析?对我来说最好的办法是使用reduce.xml 和extended.xml 收到错误,但至少在使用extended.xml 时我应该收到错误....

BR、MU

标签: c#xmlxml-serialization

解决方案


推荐阅读