问题描述
有没有办法强制 XML Deserialize 仅转换为完全匹配的类对象并在不完全匹配时抛出异常(或错误)?
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 (将#修改为@)