上一篇讲了如何使用XmlDocument和XPath操作XML,这篇主要讲讲如何使用序列化的方式来操作XML
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。.NET Framework 提供两种序列化技术:二进制序列化和XML、SOAP序列化(引自MSDNhttp://msdn.microsoft.com/zh-cn/library/7ay27kt9(VS.80).aspx)
把对象转换为XML文档的过程称为对象的XML序列化。
把XML文档恢复为对象的过程称为对象的XML反序列化。
XML序列化的应该很广泛,典型的有数据的传输或者动态数据的保存或者简单格式的XML操作,提到XML序列化,有个类肯定是跑不掉的,那就是XmlSerializer,这个类可以将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。有关XmlSerializer的更多信息请参考MSDN(http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlserializer(VS.80).aspx)
下面举几个简单的例子来说明下如何使用XmlSerializer来操作XML
假设有如下XML
- <?xml version="1.0" encoding="utf-8"?>
- <Root>
- <OutputPath></OutputPath>
- <InitialDirectory></InitialDirectory>
- <Configs>
- <Config DisplayName="">
- <UserName></UserName>
- <PassWord></PassWord>
- <Path></Path>
- <ProjectPath></ProjectPath>
- </Config>
- <Config DisplayName="">
- <UserName></UserName>
- <PassWord></PassWord>
- <Path></Path>
- <ProjectPath></ProjectPath>
- </Config>
- </Configs>
- </Root>
我们需要建两个类
- [Serializable]
- public class Config
- {
- [NonSerialized]
- private string displayName = String.Empty;
- [XmlAttribute("DisplayName")]
- public string DisplayName
- {
- get { return displayName; }
- set { displayName = value; }
- }
- [NonSerialized]
- private string userName = String.Empty;
- [XmlElement("UserName")]
- public string UserName
- {
- get { return userName; }
- set { userName = value; }
- }
- [NonSerialized]
- private string passWord = String.Empty;
- [XmlElement("PassWord ")]
- public string PassWord
- {
- get { return passWord; }
- set { passWord = value; }
- }
- [NonSerialized]
- private string path = String.Empty;
- [XmlElement("Path")]
- public string Path
- {
- get { return path; }
- set { path = value; }
- }
- [NonSerialized]
- private string projectPath = String.Empty;
- [XmlElement("ProjectPath")]
- public string ProjectPath
- {
- get { return projectPath; }
- set { projectPath = value; }
- }
- }
- [Serializable]
- [XmlRoot("Root")]
- [XmlInclude(typeof(Config))]
- public class SerializeConfigs
- {
- [NonSerialized]
- private string outputPath = String.Empty;
- [XmlElement("OutputPath")]
- public string OutputPath
- {
- get { return outputPath; }
- set { outputPath = value; }
- }
- [NonSerialized]
- private string initialDirectory = String.Empty;
- [XmlElement("InitialDirectory")]
- public string InitialDirectory
- {
- get { return initialDirectory; }
- set { initialDirectory = value; }
- }
- [NonSerialized]
- private List<Config> configs = new List<Config>();
- [XmlArrayItem("Configs", typeof(Config), ElementName = "Config")]
- public List<Config> Configs
- {
- get { return vssConfigs; }
- set { vssConfigs = value; }
- }
- }
对上面的两个类做个简单的说明:
1、你想执行序列化的类必须声明Serializable属性
2、在XML序列化中你可以使用NonSerialized或者XmlIgnore属性来决定某个Filed是否被序列化
3、如果该Filed是XML节点的属性的话,请使用XmlAttribute
4、通过Attribute可以使类中的字段名称与XML节点名称不一致
好了,准备工作都做完了,下面让我们看看具体的代码吧
- private void Serialize()
- {
- SerializeConfigs configs = new SerializeConfigs();
- XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
- StreamWriter myWriter = new StreamWriter(filePath);
- XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
- xmlns.Add(String.Empty, String.Empty);
- mySerializer.Serialize(myWriter, configs, xmlns);
- myWriter.Close();
- }
- private SerializeConfigs Deserialize()
- {
- XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
- FileStream myFileStream = new FileStream(filePath, FileMode.Open);
- SerializeConfigs configs = mySerializer.Deserialize(myFileStream) as SerializeConfigs;
- myFileStream.Close();
- return configs;
- }
这个例子只是最简单的一种,有兴趣的朋友可以参考MSDN的System.Xml.Serialization命名空间下的成员,有很多Attribute供我们使用(http://msdn.microsoft.com/en-us/library/system.xml.serialization.aspx)
当然如果你觉得XmlSerializer不能满足你的要求的话,你可以继承XmlSerializer、XmlSerializationReader以及XmlSerializationWriter,实现自己的XmlSerializer
欢迎转载,请注明出处~~