当我使用 XmlTextReader 反序列化 XML 文档时,没有相应类的文本元素将被简单地忽略。
Note:这是not关于 XML 中缺少的元素,这些元素需要存在,而是存在于 XML 文本中,而在代码中没有等效属性。
我本希望得到一个异常,因为如果运行时数据中缺少相应的元素并且我稍后对其进行序列化,则生成的 XML 文档将与原始文档不同。因此忽略它是不安全的(在我的实际情况中,我只是忘记定义给定文档包含的 99 个以上类之一,而且我一开始没有注意到)。
那么这是否正常?如果是,为什么?如果元素无法序列化,我可以以某种方式请求我想要获得异常吗?
在下面的 XML 示例中,我故意拼错了“MyComandElement”以说明核心问题:
<MyRootElement>
<MyComandElement/>
</MyRootElement>
MyRootElement.cs:
public class CommandElement {};
public class MyRootElement
{
public CommandElement MyCommandElement {get; set;}
}
反序列化:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyRootElement));
XmlTextReader xmlReader = new XmlTextReader(@"pgtest.xml");
MyRootElement mbs2 = (MyRootElement)xmlSerializer.Deserialize(xmlReader);
xmlReader.Close();
正如我在进一步研究中偶然发现的那样,这个问题实际上非常容易解决,因为......
...XmlSerializer 支持事件!所要做的就是为缺失元素定义一个事件处理程序
void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
throw new Exception("Unknown element "+e.Element.Name+" found in "
+e.ObjectBeingDeserialized.ToString()+" in line "
+e.LineNumber+" at position "+e.LinePosition);
}
并使用 XmlSerializer 注册事件:
xmlSerializer.UnknownElement += Serializer_UnknownElement;
该主题被处理在MSDN,其中人们还了解到
默认情况下,调用 Deserialize 方法后,XmlSerializer 会忽略未知类型的 XML 属性。
毫不奇怪,还有丢失属性、节点和对象的事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)