在.NET中操作XML(二)

        上一篇讲了如何使用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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Root>
  3.   <OutputPath></OutputPath>
  4.   <InitialDirectory></InitialDirectory>
  5.   <Configs>
  6.     <Config DisplayName="">
  7.       <UserName></UserName>
  8.       <PassWord></PassWord>
  9.       <Path></Path>
  10.       <ProjectPath></ProjectPath>
  11.     </Config>
  12.     <Config DisplayName="">
  13.       <UserName></UserName>
  14.       <PassWord></PassWord>
  15.       <Path></Path>
  16.       <ProjectPath></ProjectPath>
  17.     </Config>
  18.   </Configs>
  19. </Root>

我们需要建两个类

  1. [Serializable]
  2. public class Config
  3. {
  4.     [NonSerialized]
  5.     private string displayName = String.Empty;
  6.     [XmlAttribute("DisplayName")]
  7.     public string DisplayName
  8.     {
  9.         get { return displayName; }
  10.         set { displayName = value; }
  11.     }
  12.     [NonSerialized]
  13.     private string userName = String.Empty;
  14.     [XmlElement("UserName")]
  15.     public string UserName
  16.     {
  17.         get { return userName; }
  18.         set { userName = value; }
  19.     }
  20.     [NonSerialized]
  21.     private string passWord = String.Empty;
  22.     [XmlElement("PassWord ")]
  23.     public string PassWord 
  24.     {
  25.         get { return passWord; }
  26.         set { passWord = value; }
  27.     }
  28.     [NonSerialized]
  29.     private string path = String.Empty;
  30.     [XmlElement("Path")]
  31.     public string Path
  32.     {
  33.         get { return path; }
  34.         set { path = value; }
  35.     }
  36.     [NonSerialized]
  37.     private string projectPath = String.Empty;
  38.     [XmlElement("ProjectPath")]
  39.     public string ProjectPath
  40.     {
  41.         get { return projectPath; }
  42.         set { projectPath = value; }
  43.     }
  44. }
  1. [Serializable]
  2. [XmlRoot("Root")]
  3. [XmlInclude(typeof(Config))]
  4. public class SerializeConfigs
  5. {
  6.     [NonSerialized]
  7.     private string outputPath = String.Empty;
  8.     [XmlElement("OutputPath")]
  9.     public string OutputPath
  10.     {
  11.         get { return outputPath; }
  12.         set { outputPath = value; }
  13.     }
  14.     [NonSerialized]
  15.     private string initialDirectory = String.Empty;
  16.     [XmlElement("InitialDirectory")]
  17.     public string InitialDirectory
  18.     {
  19.         get { return initialDirectory; }
  20.         set { initialDirectory = value; }
  21.     }
  22.     [NonSerialized]
  23.     private List<Config> configs = new List<Config>();
  24.     [XmlArrayItem("Configs"typeof(Config), ElementName = "Config")]
  25.     public List<Config> Configs
  26.     {
  27.         get { return vssConfigs; }
  28.         set { vssConfigs = value; }
  29.     }
  30. }

对上面的两个类做个简单的说明:

1、你想执行序列化的类必须声明Serializable属性

2、在XML序列化中你可以使用NonSerialized或者XmlIgnore属性来决定某个Filed是否被序列化

3、如果该Filed是XML节点的属性的话,请使用XmlAttribute

4、通过Attribute可以使类中的字段名称与XML节点名称不一致

 

好了,准备工作都做完了,下面让我们看看具体的代码吧

  1. private void Serialize()
  2. {
  3.     SerializeConfigs configs = new SerializeConfigs();    
  4.     XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
  5.     StreamWriter myWriter = new StreamWriter(filePath);
  6.     XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
  7.     xmlns.Add(String.Empty, String.Empty);
  8.     mySerializer.Serialize(myWriter, configs, xmlns);
  9.     myWriter.Close();
  10. }
  11. private SerializeConfigs Deserialize()
  12. {
  13.     XmlSerializer mySerializer = new XmlSerializer(typeof(SerializeConfigs));
  14.     FileStream myFileStream = new FileStream(filePath, FileMode.Open);
  15.     SerializeConfigs configs = mySerializer.Deserialize(myFileStream) as SerializeConfigs;
  16.     myFileStream.Close();
  17.     return configs;
  18. }

这个例子只是最简单的一种,有兴趣的朋友可以参考MSDN的System.Xml.Serialization命名空间下的成员,有很多Attribute供我们使用(http://msdn.microsoft.com/en-us/library/system.xml.serialization.aspx

当然如果你觉得XmlSerializer不能满足你的要求的话,你可以继承XmlSerializer、XmlSerializationReader以及XmlSerializationWriter,实现自己的XmlSerializer 

 

 

欢迎转载,请注明出处~~

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值