在反序列化期间,只会忽略未知元素

当我使用XmlTextReader反序列化XML文档时,将忽略没有相应类的文本元素。

注意:不是关于XML缺少的元素,而是需要存在的元素,而是存在于XML文本中,而不是代码中具有等效属性。

我本来希望得到一个例外,因为如果运行时数据中缺少相应的元素并且我稍后将其序列化,则生成的XML文档将与原始XML文档不同。 所以忽略它是不安全的(在我的实际案例中,我只是忘记定义给定文档包含的99个以上类中的一个,而我最初没有注意到)。

这是正常的,如果是,为什么? 如果元素无法序列化,我可以以某种方式请求我想获得exception吗?

在下面的示例-XML中,我故意拼写错误的“MyComandElement”来说明核心问题:

   

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属性。

毫不奇怪,还有缺少属性,节点和对象的事件。

这是正常的,如果是,为什么?

因为你可能正在使用别人的XML文档,虽然他们在XML中定义了300个不同的元素,但你只关心两个。 您是否应该被迫为所有元素创建类并反序列化所有元素,以便能够访问您关心的两个元素?

或许你正在使用一个随着时间推移而变化的系统。 您正在编写消耗当前XML的代码,如果稍后引入新的元素/属性,它们不应该阻止您测试和部署的代码继续使用他们理解的那些XML部分(在此插入警告, ,希望,如果您处于这种情况,您/ XML作者不会在以后介绍元素,这对于理解正确处理文档至关重要)。

这些是同一个硬币的两面,为什么如果系统遇到需要反序列化的XML文档中的意外部分,系统可能不会爆炸。