You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:32:00