转载

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序...

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

本节导读: 本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet/DataTable互转换操作,XML序列化及反序列化通用方法等)。  

读前必备:

A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的实例

B.类的成员       [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

C.数组与集合   [.net 面向对象编程基础] (17) 数组与集合

D.泛型           [.net 面向对象编程基础] (18) 泛型

E.LINQ使用   [.net 面向对象编程基础] (20) LINQ使用

1. 通过序列化接口IXmlSerializable实现XML序列化

命名空间:System.Xml.Serialization

接口:IXmlSerializable

方法:

XmlSchema GetSchema();

void ReadXml(XmlReader reader);

void WriteXml(XmlWriter writer);

下面通过示例介绍关于序列化接口的使用,还是通过博客园文章为例:

定义文章实体类及文章调用方法:  

public class MyBlogs {  /// <summary>  /// 获取我的博客园中文章  /// </summary>  /// <returns></returns>  public static List<MyArticle> GetMyArticle(int count)  {   var document = XDocument.Load(    "http://wcf.open.cnblogs.com/blog/u/yubinfeng/posts/1/" + count    );   List<MyArticle> myArticleList = new List<MyArticle>();   var elements = document.Root.Elements();   //在进行这个工作之前,我们先获取我博客中的文章列表   var result = elements.Where(m => m.Name.LocalName == "entry").Select(myArticle => new MyArticle   {    id = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "id").Value),    title = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "title").Value,    published = Convert.ToDateTime(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "published").Value),    updated = Convert.ToDateTime(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "updated").Value),    diggs = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "diggs").Value),    views = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "views").Value),    comments = Convert.ToInt32(myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "comments").Value),    summary = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "summary").Value,    link = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "link").Attribute("href").Value,    author = myArticle.Elements().SingleOrDefault(x => x.Name.LocalName == "author").Elements().SingleOrDefault(x => x.Name.LocalName == "name").Value   }).OrderByDescending(m => m.published);   myArticleList.AddRange(result);   return myArticleList;  } } /// <summary /// 我的博客文章实体类 /// </summary> public class MyArticle {  /// <summary>  /// 文章编号  /// </summary>  public int id { get; set; }  /// <summary>  /// 文章标题  /// </summary>  public string title { get; set; }  /// <summary>  /// 文章摘要  /// </summary>  public string summary { get; set; }  /// <summary>  /// 发布时间  /// </summary>  public DateTime published { get; set; }  /// <summary>  /// 最后更新时间  /// </summary>  public DateTime updated { get; set; }  /// <summary>  /// URL地址  /// </summary>  public string link { get; set; }  /// <summary>  /// 推荐数  /// </summary>  public int diggs { get; set; }  /// <summary>  /// 浏览量  /// </summary>  public int views { get; set; }  /// <summary>  /// 评论数  /// </summary>  public int comments { get; set; }  /// <summary>  /// 作者  /// </summary>  public string author { get; set; } } 

XML通过接口序列化和反序列化的方法

/// <summary> /// 序列化XML 对象=》XML文本 /// 下面注释项,可根据需要使用 /// </summary> /// <param name="Obj"></param> /// <returns></returns> public static string ObjectToXmlSerializer(Object Obj) {  string XmlString = "";  XmlWriterSettings settings = new XmlWriterSettings();  //settings.OmitXmlDeclaration = true;//去除xml声明  settings.Encoding = Encoding.Default;//使用默认编码  //settings.IndentChars = "--"; //使用指定字符缩进  settings.Indent = true; //换行缩进  using (System.IO.MemoryStream mem = new MemoryStream())  {   using (XmlWriter writer = XmlWriter.Create(mem, settings))   {    //去除默认命名空间xmlns:xsd和xmlns:xsi    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();    ns.Add("", "");    XmlSerializer formatter = new XmlSerializer(Obj.GetType());    formatter.Serialize(writer, Obj, ns);   }   XmlString = Encoding.Default.GetString(mem.ToArray());  }  return XmlString; } /// <summary> /// 反序列化 XML文本=》对象     /// </summary> /// <typeparam name="T"></typeparam> /// <param name="str"></param> /// <returns></returns> public static T ObjectToXmlDESerializer<T>(string str) where T : class {  object obj;  using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str)))  {   using (XmlReader reader = XmlReader.Create(mem))   {    XmlSerializer formatter = new XmlSerializer(typeof(T));    obj = formatter.Deserialize(reader);   }  }  return obj as T; } 

调用如下:

//命名空间:System.Xml.Serialization //接口:IXmlSerializable //方法:XmlSchema GetSchema();void ReadXml(XmlReader reader);void WriteXml(XmlWriter writer);  //(1)获取我博客园中最后10篇文章 (实际上这个过程也是反序列化) List<MyArticle> myArticleList = MyBlogs.GetMyArticle(10);  //序列化并输出XML文本 string xmlString = ObjectToXmlSerializer(myArticleList); Console.Write(xmlString);   //序列化XML文本,遍历输出对象             List<MyArticle> myNewArticleList = ObjectToXmlDESerializer<List<MyArticle>>(xmlString);  //遍历输出反序化的新对象myNewArticleList myNewArticleList.ForEach(m =>     Console.WriteLine("文章编号:" + m.id + "/n文章标题:" + m.title) );

运行结果如下:

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序... [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序...

2. XML类

我们在序列化XML的时候,经常要操作XML,下面我列出XML类的一些成员,供参考查阅

XML操作的命名空间:System.Xml;

名称

描述

XmlAttribute

表示一个特性对象的集合,这些对象控制 XmlSerializer 如何序列化和反序列化对象

XmlArrayAttribute

指定 XmlSerializer 应将特定的类成员序列化为 XML 元素数组

XmlArrayItemAttribute

指定 XmlSerializer 可以放置在序列化数组中的派生类型

XmlArrayItemAttributes

表示 XmlArrayItemAttribute 对象的集合

XmlAttributeAttribute

指定 XmlSerializer 应将类成员作为 XML 特性序列化

XmlChoiceIdentifierAttribute

指定可以通过使用枚举来进一步消除成员的歧义

XmlElementAttribute

在 XmlSerializer 序列化或反序列化包含对象时,指示公共字段或属性表示 XML 元素

XmlElementAttributes

表示 XmlElementAttribute 的集合, XmlSerializer 将其用于它重写序列化类的默认方式

XmlEnumAttribute

控制 XmlSerializer 如何序列化枚举成员

XmlIgnoreAttribute

指示 XmlSerializer 方法不序列化公共字段或公共读 / 写属性值

XmlIncludeAttribute

允许 XmlSerializer 在它序列化或反序列化对象时识别类型

XmlRootAttribute

控制视为 XML 根元素的属性目标的 XML 序列化

XmlTextAttribute

当序列化或反序列化时,想 XmlSerializer 指示应将此成员作为 XML 文本处理

XmlTypeAttribute

控制当属性目标由 XmlSerializer 序列化时生成的 XML 结构

XmlAnyAttributeAttribute

指定成员 ( 返回 XmlAttribute 对象的数组的字段 ) 可以包含 XML 属性

XmlAnyElementAttribute

指定成员可以包含对象,该对象表示在序列化或反序列化的对象中没有相应成员的所有 XML 元素

XmlAnyElementAttributes

表示 XmlAnyElementAttribute 对象的集合

XmlAttributeEventArgs

为 UnKnowAttribute 提供数据

XmlAttributeOverrides

允许你在使用 XmlSerializer 序列化或反序列化时重写属性、字段和类特性

XmlElementEventArgs

为 UnknownElement 事件提供数据

XmlNamespaceDeclarationsAttribute

指定目标属性、参数、返回值或类成员包含与 XML 文档中所用命名空间关联的前缀

XmlNodeEventArgs

为 UnknownNode 时间提供数据

XmlSerializer

将对象序列化到 XML 文档中和从 XML 文档中反序列化对象, XmlSerializer 使你得以控制如何将对象编码到 XML 中

XmlSerializerNamespaces

包含 XmlSerializer 用于在 XML 文档实例中生成限定名的 XML 命名空间和前缀

XmlTypeMapping

包含从一种类型到另一种类型的映射

更多更详细的说明,请看官方API: http://msdn.microsoft.com/zh-cn/library/System.Xml.Serialization(v=vs.110).aspx

3. XML封装类 

最后整理一个XML的封装类提供给小伙伴们,里面包含了XML节点到DataSet,DataTable及XML序列化和反序列化,XML写入文件或读取XML文件及节点等。

文件名:XmlHelper.cs

代码如下:

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序...
  1 using System;   2 using System.Collections.Generic;   3 using System.Linq;   4 using System.Text;   5 using System.Threading.Tasks;   6 using System.IO;   7 using System.Data;   8 using System.Xml;   9 using System.Xml.Serialization;  10 using System.Xml.Linq;  11   12 namespace Common  13 {  14     /// <summary>  15     /// Xml通用类  16     /// Author:YuBinfeng  17     /// Data:2015/07/10  18     /// </summary>  19     public class XmlHelper  20     {  21        22         #region XML的基础读写  23   24         #region 将XML文本写入到指定路径的文件  25         /// <summary>  26         /// 将XML文本写入到指定路径的文件  27         /// </summary>  28         /// <param name="XMLString"></param>  29         /// <param name="filePath"></param>  30         /// <returns></returns>  31         public static bool WriteXmlString(string XMLString,string filePath)  32         {  33             try  34             {                  35                     File.WriteAllText(filePath, XMLString,Encoding.Default);  36                     return true;               37             }  38             catch  39             {  40                 return false;  41             }  42         }  43         #endregion  44   45         #region 从指定的路径读取XML文本  46         /// <summary>  47         /// 将XML文本写入到指定路径的文件  48         /// </summary>  49         /// <param name="XMLString"></param>  50         /// <param name="filePath"></param>  51         /// <returns></returns>  52         public static string  ReadXmlString( string filePath)  53         {  54             try  55             {  56                 XmlDocument xmlDoc = new XmlDocument();  57                 xmlDoc.Load(filePath);  58                 return xmlDoc.InnerXml;       59             }  60             catch (Exception ex)  61             {  62                 return "";  63             }  64         }  65         #endregion  66   67         #region 读取XML资源中的指定节点内容  68         /// <summary>  69         /// 读取XML资源中的指定节点内容  70         /// </summary>  71         /// <param name="source">XML资源</param>  72         /// <param name="xmlType">XML资源类型:文件,字符串</param>  73         /// <param name="nodeName">节点名称</param>  74         /// <returns>节点内容</returns>  75         public static object GetNodeValue(string source, XmlType xmlType, string nodeName)  76         {  77             XmlDocument xd = new XmlDocument();  78             if (xmlType == XmlType.File)  79             {  80                 xd.Load(source);  81             }  82             else  83             {  84                 xd.LoadXml(source);  85             }  86             XmlElement xe = xd.DocumentElement;  87             XmlNode xn = xe.SelectSingleNode("//" + nodeName);  88             if (xn != null)  89             {  90                 return xn.InnerText;  91             }  92             else  93             {  94                 return null;  95             }  96         }  97   98         /// <summary>  99         /// 读取XML资源中的指定节点内容 100         /// </summary> 101         /// <param name="source">XML资源</param> 102         /// <param name="nodeName">节点名称</param> 103         /// <returns>节点内容</returns> 104         public static object GetNodeValue(string source, string nodeName) 105         { 106             if (source == null || nodeName == null || source == "" || nodeName == "" || source.Length < nodeName.Length * 2) 107             { 108                 return null; 109             } 110             else 111             { 112                 int start = source.IndexOf("<" + nodeName + ">") + nodeName.Length + 2; 113                 int end = source.IndexOf("</" + nodeName + ">"); 114                 if (start == -1 || end == -1) 115                 { 116                     return null; 117                 } 118                 else if (start >= end) 119                 { 120                     return null; 121                 } 122                 else 123                 { 124                     return source.Substring(start, end - start); 125                 } 126             } 127         } 128         #endregion 129  130         #region 更新XML文件中的指定节点内容 131         /// <summary> 132         /// 更新XML文件中的指定节点内容 133         /// </summary> 134         /// <param name="filePath">文件路径</param> 135         /// <param name="nodeName">节点名称</param> 136         /// <param name="nodeValue">更新内容</param> 137         /// <returns>更新是否成功</returns> 138         public static bool UpdateNode(string filePath, string nodeName, string nodeValue) 139         { 140             bool flag = false; 141  142             XmlDocument xd = new XmlDocument(); 143             xd.Load(filePath); 144             XmlElement xe = xd.DocumentElement; 145             XmlNode xn = xe.SelectSingleNode("//" + nodeName); 146             if (xn != null) 147             { 148                 xn.InnerText = nodeValue; 149                 flag = true; 150             } 151             else 152             { 153                 flag = false; 154             } 155             return flag; 156         } 157         #endregion 158  159         #region 操作xml文件中指定节点的数据 160         /// <summary> 161         /// 获得xml文件中指定节点的节点数据 162         /// </summary> 163         /// <param name="TableName"></param> 164         /// <returns></returns> 165         public static string GetNodeInfoByNodeName(string path, string nodeName) 166         { 167             string XmlString = ""; 168             XmlDocument xml = new XmlDocument(); 169             xml.Load(path); 170             System.Xml.XmlElement root = xml.DocumentElement; 171             System.Xml.XmlNode node = root.SelectSingleNode("//" + nodeName); 172             if (node != null) 173             { 174                 XmlString = node.InnerText; 175             } 176             return XmlString; 177         } 178         #endregion 179         #endregion 180  181         #region 共有属性 182         /// <summary> 183         /// XML资源类型 184         /// </summary> 185         public enum XmlType 186         { 187             File, 188             String 189         }; 190         #endregion 191  192         #region XML与DataSet DataTable相关 193  194         #region 读取XML资源到DataSet中 195         /// <summary> 196         /// 读取XML资源到DataSet中 197         /// </summary> 198         /// <param name="source">XML资源,文件为路径,否则为XML字符串</param> 199         /// <param name="xmlType">XML资源类型</param> 200         /// <returns>DataSet</returns> 201         public static DataSet GetDataSet(string source, XmlType xmlType) 202         { 203             DataSet ds = new DataSet(); 204             if (xmlType == XmlType.File) 205             { 206                 ds.ReadXml(source); 207             } 208             else 209             { 210                 XmlDocument xd = new XmlDocument(); 211                 xd.LoadXml(source); 212                 XmlNodeReader xnr = new XmlNodeReader(xd); 213                 ds.ReadXml(xnr); 214             } 215             return ds; 216         } 217  218         #endregion 219  220         #region 获取一个字符串xml文档中的ds 221         /// <summary> 222         /// 获取一个字符串xml文档中的ds 223         /// </summary> 224         /// <param name="xml_string">含有xml信息的字符串</param> 225         public static void get_XmlValue_ds(string xml_string, ref DataSet ds) 226         { 227             System.Xml.XmlDocument xd = new XmlDocument(); 228             xd.LoadXml(xml_string); 229             XmlNodeReader xnr = new XmlNodeReader(xd); 230             ds.ReadXml(xnr); 231             xnr.Close(); 232             int a = ds.Tables.Count; 233         } 234         #endregion 235  236         #region 读取XML资源到DataTable中 237         /// <summary> 238         /// 读取XML资源到DataTable中 239         /// </summary> 240         /// <param name="source">XML资源,文件为路径,否则为XML字符串</param> 241         /// <param name="xmlType">XML资源类型:文件,字符串</param> 242         /// <param name="tableName">表名称</param> 243         /// <returns>DataTable</returns> 244         public static DataTable GetTable(string source, XmlType xmlType, string tableName) 245         { 246             DataSet ds = new DataSet(); 247             if (xmlType == XmlType.File) 248             { 249                 ds.ReadXml(source); 250             } 251             else 252             { 253                 XmlDocument xd = new XmlDocument(); 254                 xd.LoadXml(source); 255                 XmlNodeReader xnr = new XmlNodeReader(xd); 256                 ds.ReadXml(xnr); 257             } 258             return ds.Tables[tableName]; 259         } 260         #endregion 261  262         #region 读取XML资源中指定的DataTable的指定行指定列的值 263         /// <summary> 264         /// 读取XML资源中指定的DataTable的指定行指定列的值 265         /// </summary> 266         /// <param name="source">XML资源</param> 267         /// <param name="xmlType">XML资源类型:文件,字符串</param> 268         /// <param name="tableName">表名</param> 269         /// <param name="rowIndex">行号</param> 270         /// <param name="colName">列名</param> 271         /// <returns>值,不存在时返回Null</returns> 272         public static object GetTableCell(string source, XmlType xmlType, string tableName, int rowIndex, string colName) 273         { 274             DataSet ds = new DataSet(); 275             if (xmlType == XmlType.File) 276             { 277                 ds.ReadXml(source); 278             } 279             else 280             { 281                 XmlDocument xd = new XmlDocument(); 282                 xd.LoadXml(source); 283                 XmlNodeReader xnr = new XmlNodeReader(xd); 284                 ds.ReadXml(xnr); 285             } 286             return ds.Tables[tableName].Rows[rowIndex][colName]; 287         } 288         #endregion 289  290         #region 读取XML资源中指定的DataTable的指定行指定列的值 291         /// <summary> 292         /// 读取XML资源中指定的DataTable的指定行指定列的值 293         /// </summary> 294         /// <param name="source">XML资源</param> 295         /// <param name="xmlType">XML资源类型:文件,字符串</param> 296         /// <param name="tableName">表名</param> 297         /// <param name="rowIndex">行号</param> 298         /// <param name="colIndex">列号</param> 299         /// <returns>值,不存在时返回Null</returns> 300         public static object GetTableCell(string source, XmlType xmlType, string tableName, int rowIndex, int colIndex) 301         { 302             DataSet ds = new DataSet(); 303             if (xmlType == XmlType.File) 304             { 305                 ds.ReadXml(source); 306             } 307             else 308             { 309                 XmlDocument xd = new XmlDocument(); 310                 xd.LoadXml(source); 311                 XmlNodeReader xnr = new XmlNodeReader(xd); 312                 ds.ReadXml(xnr); 313             } 314             return ds.Tables[tableName].Rows[rowIndex][colIndex]; 315         } 316         #endregion 317  318         #region 将DataTable写入XML文件中 319         /// <summary> 320         /// 将DataTable写入XML文件中 321         /// </summary> 322         /// <param name="dt">含有数据的DataTable</param> 323         /// <param name="filePath">文件路径</param> 324         public static void SaveTableToFile(DataTable dt, string filePath) 325         { 326             DataSet ds = new DataSet("Config"); 327             ds.Tables.Add(dt.Copy()); 328             ds.WriteXml(filePath); 329         } 330         #endregion 331  332         #region 将DataTable以指定的根结点名称写入文件 333         /// <summary> 334         /// 将DataTable以指定的根结点名称写入文件 335         /// </summary> 336         /// <param name="dt">含有数据的DataTable</param> 337         /// <param name="rootName">根结点名称</param> 338         /// <param name="filePath">文件路径</param> 339         public static void SaveTableToFile(DataTable dt, string rootName, string filePath) 340         { 341             DataSet ds = new DataSet(rootName); 342             ds.Tables.Add(dt.Copy()); 343             ds.WriteXml(filePath); 344         } 345         #endregion 346  347         #region 使用DataSet方式更新XML文件节点 348         /// <summary> 349         /// 使用DataSet方式更新XML文件节点 350         /// </summary> 351         /// <param name="filePath">XML文件路径</param> 352         /// <param name="tableName">表名称</param> 353         /// <param name="rowIndex">行号</param> 354         /// <param name="colName">列名</param> 355         /// <param name="content">更新值</param> 356         /// <returns>更新是否成功</returns> 357         public static bool UpdateTableCell(string filePath, string tableName, int rowIndex, string colName, string content) 358         { 359             bool flag = false; 360             DataSet ds = new DataSet(); 361             ds.ReadXml(filePath); 362             DataTable dt = ds.Tables[tableName]; 363  364             if (dt.Rows[rowIndex][colName] != null) 365             { 366                 dt.Rows[rowIndex][colName] = content; 367                 ds.WriteXml(filePath); 368                 flag = true; 369             } 370             else 371             { 372                 flag = false; 373             } 374             return flag; 375         } 376         #endregion 377  378         #region 使用DataSet方式更新XML文件节点 379         /// <summary> 380         /// 使用DataSet方式更新XML文件节点 381         /// </summary> 382         /// <param name="filePath">XML文件路径</param> 383         /// <param name="tableName">表名称</param> 384         /// <param name="rowIndex">行号</param> 385         /// <param name="colIndex">列号</param> 386         /// <param name="content">更新值</param> 387         /// <returns>更新是否成功</returns> 388         public static bool UpdateTableCell(string filePath, string tableName, int rowIndex, int colIndex, string content) 389         { 390             bool flag = false; 391  392             DataSet ds = new DataSet(); 393             ds.ReadXml(filePath); 394             DataTable dt = ds.Tables[tableName]; 395  396             if (dt.Rows[rowIndex][colIndex] != null) 397             { 398                 dt.Rows[rowIndex][colIndex] = content; 399                 ds.WriteXml(filePath); 400                 flag = true; 401             } 402             else 403             { 404                 flag = false; 405             } 406             return flag; 407         } 408         #endregion 409  410         #endregion 411  412         #region XML序列化与反序列化相关 413  414         /// <summary> 415         /// 序列化XML 对象=》XML文本 416         /// 下面注释项,可根据需要使用 417         /// </summary> 418         /// <param name="Obj"></param> 419         /// <returns></returns> 420         public static string ObjectToXmlSerializer(Object Obj) 421         { 422             string XmlString = ""; 423             XmlWriterSettings settings = new XmlWriterSettings(); 424             //settings.OmitXmlDeclaration = true;//去除xml声明 425             settings.Encoding = Encoding.Default;//使用默认编码 426                                                  //settings.IndentChars = "--"; //使用指定字符缩进 427             settings.Indent = true; //换行缩进 428  429             using (System.IO.MemoryStream mem = new MemoryStream()) 430             { 431                 using (XmlWriter writer = XmlWriter.Create(mem, settings)) 432                 { 433                     //去除默认命名空间xmlns:xsd和xmlns:xsi 434                     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 435                     ns.Add("", ""); 436  437                     XmlSerializer formatter = new XmlSerializer(Obj.GetType()); 438                     formatter.Serialize(writer, Obj, ns); 439                 } 440                 XmlString = Encoding.Default.GetString(mem.ToArray()); 441             } 442             return XmlString; 443         } 444  445         /// <summary> 446         /// 反序列化 XML文本=》对象        447         /// </summary> 448         /// <typeparam name="T"></typeparam> 449         /// <param name="str"></param> 450         /// <returns></returns> 451         public static T ObjectToXmlDESerializer<T>(string str) where T : class 452         { 453             object obj; 454             using (System.IO.MemoryStream mem = new MemoryStream(Encoding.Default.GetBytes(str))) 455             { 456                 using (XmlReader reader = XmlReader.Create(mem)) 457                 { 458                     XmlSerializer formatter = new XmlSerializer(typeof(T)); 459                     obj = formatter.Deserialize(reader); 460                 } 461             } 462             return obj as T; 463         } 464  465         #endregion 466  467     } 468 }
View Code

4. 本节要点:

A.本节主要介绍了通过序列化接口IXmlSerializable实现XML序列化

B.XML本身的操作简单介绍

C.最后提供了一个序列化及XML操作的通用类

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

返回目录

  <如果对你有帮助,记得点一下 推荐 哦,如有 有不明白或错误 之处 ,请多交流>    

<对本系列文章阅读有困难的朋友,请先看 《.net 面向对象编程基础》 >

<转载声明:技术需要共享精神,欢迎转载本博客中的文章,但请注明版权及URL>

.NET 技术交流群:467189533 [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序...

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

正文到此结束
Loading...