仅将 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;            
    }
}

exact.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 完全匹配,因此应该可以毫无问题地反序列化它

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

老实说,我原以为使用reduced.xml会收到错误,但是反序列化没有问题。我认为如果“年龄”不可为空(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>

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

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

BR, 静音

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)