自定义Xml序列化中断列表功能

本文关键字:列表 功能 中断 序列化 Xml 自定义 | 更新日期: 2023-09-27 17:59:37

好的,所以我有一个类型:

public class MonitorConfiguration 
{
    private string m_sourcePath;
    private string m_targetPath;
    public string TargetPath
    {
        get { return m_targetPath; }
        set { m_targetPath = value; }
    }
    public string SourcePath
    {
        get { return m_sourcePath; }
        set { m_sourcePath = value; }
    }

    //need a parameterless constructor, just for serialization
    private MonitorConfiguration()
    {
    }
    public MonitorConfiguration(string source, string target)
    {
        m_sourcePath = source;
        m_targetPath = target;
    }
}

当我序列化和取消序列化这些列表时,比如这个

        XmlSerializer xs = new XmlSerializer(typeof(List<MonitorConfiguration>));
        using (Stream isfStreamOut = isf.OpenFile("Test1.xml", FileMode.Create))
        {
            xs.Serialize(isfStreamOut, monitoringPaths);
        }
        using (Stream isfStreamIn = isf.OpenFile("Test1.xml", FileMode.Open))
        {
            monitoringPaths = xs.Deserialize(isfStreamIn) as List<MonitorConfiguration>;
        }

一切都很好。

然而,我真的想隐藏属性的公共设置者。这样可以防止XML序列化程序对它们进行序列化。所以,我实现了我自己的,像这样:

将类声明更改为:public class MonitorConfiguration : IXmlSerializable并添加这些:

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
        //make sure we read everything
        while (reader.Read())
        {
            //find the first element we care about...
            if (reader.Name == "SourcePath")
            {
                m_sourcePath = reader.ReadElementString("SourcePath");
                m_targetPath = reader.ReadElementString("TargetPath");
                // return;
            }
        }
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("SourcePath", m_sourcePath);
        writer.WriteElementString("TargetPath", m_targetPath);
    }

这似乎奏效了,然而,我只把清单上的第一项拿出来,其他的都忘了。我已经尝试过使用和不使用当前已被注释掉的返回。我在这里做错了什么?

需要注意的是,这只是一个说明问题的代码片段;我被限制在使用哪种XML串行化技术是我永恒的机制。

自定义Xml序列化中断列表功能

这篇CodeProject文章解释了如何在使用IXmlSerializable时绕过一些陷阱。

具体来说,当您在ReadXml中找到所有元素时,您可能需要调用reader.ReadEndElement();(请参阅文章中的如何实现ReadXml?一节)。