zoukankan      html  css  js  c++  java
  • XML文件的序列化和反序列化

    XML文件具有轻量级、规范统一、支持跨平台、跨语言、跨操作系统等特点,所以广泛被用来传递和处理数据。而.net中也提供了两种处理XML数据的方法: 

    1、XmlDocument方法,操作XmlElement、XmlAttribute等节点。(网上很多,此处不再累述)

    2、XmlSerializer序列化对象和反序列化。

    本文主要针对第二中方法(实现起来简单方便),先要引用System.Xml.Serialization,一下步入正题:

    利用泛型的特点,写一个用来处理所有类型序列化和反序列化的类SerializaHelper

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.IO;
     6 using System.Xml.Serialization;
     7 
     8 namespace SerializaHelper
     9 {
    10     public class XmlSerializHelper<T>
    11     {
    12         //传入T类型对象,序列化成xml
    13         public static void SerializToXml(string filePath, T obj)
    14         {
    15             try
    16             {
    17                 using (StreamWriter sw = new StreamWriter(filePath))
    18                 {
    19                     XmlSerializer xs = new XmlSerializer(typeof(T));
    20                     xs.Serialize(sw, obj);
    21                 }
    22             }
    23             catch (Exception)
    24             {
    25                 throw;
    26             }
    27         }
    28 
    29         //传入xml,反序列化成T类型的对象
    30         public static T DeserializFromXml(string filePath)
    31         {
    32             if (string.IsNullOrEmpty(filePath))
    33             {
    34                 return default(T);
    35             }
    36             try
    37             {
    38                 using (StreamReader sr = new StreamReader(filePath))
    39                 {
    40                     XmlSerializer xs = new XmlSerializer(typeof(T));
    41                     return (T)xs.Deserialize(sr);
    42                 }
    43             }
    44             catch (Exception)
    45             {
    46                 throw;
    47             }
    48         }
    49     }
    50 }

    这是用来处理xml和对象之间转换的类,以一下xml为例来演示将xml转换成对象的过程:

    View Code
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <SiteConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
     3   <SiteUrl>http://www.readnovel.com/</SiteUrl>
     4   <SiteName>小说阅读网</SiteName>  
     5   <BookList>
     6     <BookInfo>
     7       <Name>龙牙神兵</Name>      
     8       <Url>http://www.readnovel.com/partlist/197919.html</Url>
     9       <Author>烟云公子</Author>
    10     </BookInfo>
    11     <BookInfo>
    12       <Name>特种兵在都市</Name>
    13       <Url>http://www.readnovel.com/partlist/120040.html</Url>
    14       <Author>夜十三</Author>
    15     </BookInfo>
    16     <BookInfo>
    17       <Name>都市之最天才</Name>
    18       <QidianBookId>http://www.readnovel.com/partlist/193444.html</QidianBookId>
    19       <Author>十九周年</Author>
    20     </BookInfo>
    21     <BookInfo>
    22       <Name>苍天神木诀</Name>
    23       <Url>http://www.readnovel.com/partlist/196434.html</Url>
    24       <Author>妖姬天下</Author>
    25     </BookInfo>
    26   </BookList>
    27 </SiteConfig>

    根据示例xml新建实体类SiteConfig.cs和BookInfo.cs:

     1 namespace XmlSerialzer
     2 {
     3     [Serializable]
     4     public class SiteConfig
     5     {
     6         //[XmlElement]
     7         public string SiteUrl { get; set; }
     8 
     9         public string SiteName { get; set; }
    10 
    11         public List<BookInfo> BookList { get; set; }
    12     }
    13 }
     1 namespace XmlSerialzer
     2 {
     3     [Serializable]
     4     public class BookInfo
     5     {
     6         public string Name { get; set; }
     7 
     8         public string Url { get; set; }
     9 
    10         public string Author { get; set; }
    11     }
    12 }

    转化的过程很简单,只需要调用DeserializFromXml然后指定xml文件的路径即可:

    1         static void Main(string[] args)
    2         {
    3             SiteConfig siteConfig = XmlSerialzer.SerializaHelper<SiteConfig>.DeserialzFromXml(@"C:\Documents and Settings\hp\桌面\XmlSerialzer\xiaoshuo.xml");
    4 
    5             Console.WriteLine("siteConfig.SiteName:" + siteConfig.SiteName);
    6             Console.WriteLine("siteConfig.SiteUrl:" + siteConfig.SiteUrl);
    7             Console.WriteLine("siteConfig.BookList.Count:" + siteConfig.BookList.Count);
    8         }

    输出如下图所示:

    将对象序列化成xml也很简单:

     1         static void Main(string[] args)
     2         {            
     3             SiteConfig siteConfig = new SiteConfig()
     4             {
     5                 BookList = new List<BookInfo>()
     6                 {
     7                     new BookInfo(){Author="天蚕土豆",Name="武动乾坤",Url="http://www.qidian.com/Book/2048120.aspx"},
     8                     new BookInfo(){Author="我吃西红柿",Name="莽荒纪",Url="http://www.qidian.com/Book/2502372.aspx"},
     9                     new BookInfo(){Author="忘语",Name="凡人修仙传",Url="http://www.qidian.com/Book/107580.aspx"}
    10                 },
    11                 SiteName = "起点小说网",
    12                 SiteUrl = "http://www.qidian.com"
    13             };
    14             XmlSerialzer.SerializaHelper<SiteConfig>.SerializToXml("MyLoveBook.xml",siteConfig);
    15         }

    查看MyLoveBook.xml文件:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <SiteConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     3   <SiteUrl>http://www.qidian.com</SiteUrl>
     4   <SiteName>起点小说网</SiteName>
     5   <BookList>
     6     <BookInfo>
     7       <Name>武动乾坤</Name>
     8       <Url>http://www.qidian.com/Book/2048120.aspx</Url>
     9       <Author>天蚕土豆</Author>
    10     </BookInfo>
    11     <BookInfo>
    12       <Name>莽荒纪</Name>
    13       <Url>http://www.qidian.com/Book/2502372.aspx</Url>
    14       <Author>我吃西红柿</Author>
    15     </BookInfo>
    16     <BookInfo>
    17       <Name>凡人修仙传</Name>
    18       <Url>http://www.qidian.com/Book/107580.aspx</Url>
    19       <Author>忘语</Author>
    20     </BookInfo>
    21   </BookList>
    22 </SiteConfig>

    xml的结构顺序和SiteConfig中的属性定义的先后顺序一致,且默认情况下,将字段转换成属性(XmlAttribute),现将SiteConfig中的代码稍做修改:

     1 namespace XmlSerialzer
     2 {
     3     [Serializable]
     4     public class SiteConfig
     5     {
     6         public List<BookInfo> BookList { get; set; }
     7         
     8         [XmlAttribute]
     9         public string SiteUrl { get; set; }
    10 
    11         [XmlAttribute]
    12         public string SiteName { get; set; }        
    13     }
    14 }

    转换成的xml中SiteUrl和SiteName都是SiteConfig的属性,如下所示:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <SiteConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SiteUrl="http://www.qidian.com" SiteName="起点小说网">
     3   <BookList>
     4     <BookInfo>
     5       <Name>武动乾坤</Name>
     6       <Url>http://www.qidian.com/Book/2048120.aspx</Url>
     7       <Author>天蚕土豆</Author>
     8     </BookInfo>
     9     <BookInfo>
    10       <Name>莽荒纪</Name>
    11       <Url>http://www.qidian.com/Book/2502372.aspx</Url>
    12       <Author>我吃西红柿</Author>
    13     </BookInfo>
    14     <BookInfo>
    15       <Name>凡人修仙传</Name>
    16       <Url>http://www.qidian.com/Book/107580.aspx</Url>
    17       <Author>忘语</Author>
    18     </BookInfo>
    19   </BookList>
    20 </SiteConfig>

    XmlSerializer使得xml和Object对象之间的互相转换变得很容易。

    ==================================================================================

    欢迎指正!

  • 相关阅读:
    项目进度管理-PMBook 第六章
    项目范围管理-PMBook 第五章
    PMBook 中的开发生命周期
    项目整合管理-PMBook 第四章
    PMP 学习心得
    二维码的来源和生活应用
    package main 红色波浪线
    JS中监听事件的几种方法
    PEP8规范
    RestFul API 规范
  • 原文地址:https://www.cnblogs.com/yangyp/p/XmlSerialization.html
Copyright © 2011-2022 走看看