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

时间:2013-02-16 18:17:55

标签: c# xml-serialization

好的,我有一个类型:

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>;
        }
一切正常。

但是,我真的想要隐藏属性的公共setter。这可以防止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序列化技术。

1 个答案:

答案 0 :(得分:1)

This CodeProject article解释了在使用IXmlSerializable时如何解决一些陷阱。

具体来说,当您在reader.ReadEndElement();中找到所有元素时,可能需要致电ReadXml(请参阅文章中的如何实施ReadXml 部分)。