实现IXmlSerializable后反序列化忽略其他属性,求排查读写方法问题
问题根源与修复方案
你的问题确实出在B类的ReadXml方法实现上,错误的读取逻辑导致XmlSerializer解析完第一个B对象后,阅读器位置偏离,直接跳过了后续的List和List1元素。
错误原因分析
- XmlSerializer调用
ReadXml时,reader已经定位在当前对象的起始标签(<B>)上,你代码里第一行的reader.ReadStartElement();会直接读取这个起始标签,导致阅读器跳到<B>内部的第一个元素之前,打乱了解析节奏。 - 处理完
<Name>内容后,你没有正确读取<B>的结束标签,阅读器停留在错误层级,XmlSerializer误以为整个Config的内容已解析完成,因此后续的List和List1被直接忽略。
修正后的ReadXml代码
public void ReadXml(XmlReader reader) { // 无需调用ReadStartElement,reader已处于<B>起始标签位置 Name.Clear(); // 跳过<B>起始标签,移动到内部内容节点 reader.Read(); int depth = reader.Depth; while (reader.Depth == depth && !reader.EOF) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Name") { reader.ReadStartElement("Name"); while (reader.Depth == depth + 1) { if (reader.Name == "Str") { var element = reader.ReadElementString("Str"); name.Add(element); } else { // 跳过未知元素,防止解析卡住 reader.Skip(); } } if (reader.Name == "Name") reader.ReadEndElement(); } else { // 跳过空白节点或非目标元素 reader.Skip(); } } // 读取<B>的结束标签,确保阅读器回到正确层级 if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "B") { reader.ReadEndElement(); } }
修正说明
- 移除了多余的
reader.ReadStartElement();,改用reader.Read();跳过<B>起始标签,进入内部内容解析。 - 增加了未知元素的跳过逻辑,避免遇到意外节点时解析流程卡住。
- 最后强制读取
<B>的结束标签,让阅读器回到正确层级,保证后续的List和List1元素能被XmlSerializer正常解析。
修正后重新执行序列化和反序列化操作,Config的List和List1属性就能正确加载XML中的内容了。
内容的提问来源于stack exchange,提问作者Lamp
相关产品推荐
相关产品推荐

