自定义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串行化技术是我永恒的机制。
这篇CodeProject文章解释了如何在使用IXmlSerializable时绕过一些陷阱。
具体来说,当您在ReadXml
中找到所有元素时,您可能需要调用reader.ReadEndElement();
(请参阅文章中的如何实现ReadXml?一节)。