好的,我有一个类型:
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序列化技术。
答案 0 :(得分:1)
This CodeProject article解释了在使用IXmlSerializable时如何解决一些陷阱。
具体来说,当您在reader.ReadEndElement();
中找到所有元素时,可能需要致电ReadXml
(请参阅文章中的如何实施ReadXml 部分)。