架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 22158|回复: 0

[资料] c# XML和实体类之间相互转换(序列化和反序列化)

[复制链接]
发表于 2016-8-7 18:13:29 | 显示全部楼层 |阅读模式

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Data;
  7. using System.Xml;
  8. using System.Xml.Serialization;

  9. /// <summary>
  10. /// Xml序列化与反序列化
  11. /// </summary>
  12. public class XmlUtil
  13. {
  14.     #region 反序列化
  15.     /// <summary>
  16.     /// 反序列化
  17.     /// </summary>
  18.     /// <param name="type">类型</param>
  19.     /// <param name="xml">XML字符串</param>
  20.     /// <returns></returns>
  21.     public static object Deserialize(Type type, string xml)
  22.     {
  23.         try
  24.         {
  25.             using (StringReader sr = new StringReader(xml))
  26.             {
  27.                 XmlSerializer xmldes = new XmlSerializer(type);
  28.                 return xmldes.Deserialize(sr);
  29.             }
  30.         }
  31.         catch (Exception e)
  32.         {

  33.             return null;
  34.         }
  35.     }
  36.     /// <summary>
  37.     /// 反序列化
  38.     /// </summary>
  39.     /// <param name="type"></param>
  40.     /// <param name="xml"></param>
  41.     /// <returns></returns>
  42.     public static object Deserialize(Type type, Stream stream)
  43.     {
  44.         XmlSerializer xmldes = new XmlSerializer(type);
  45.         return xmldes.Deserialize(stream);
  46.     }
  47.     #endregion

  48.     #region 序列化
  49.     /// <summary>
  50.     /// 序列化
  51.     /// </summary>
  52.     /// <param name="type">类型</param>
  53.     /// <param name="obj">对象</param>
  54.     /// <returns></returns>
  55.     public static string Serializer(Type type, object obj)
  56.     {
  57.         MemoryStream Stream = new MemoryStream();
  58.         XmlSerializer xml = new XmlSerializer(type);
  59.         try
  60.         {
  61.             //序列化对象
  62.             xml.Serialize(Stream, obj);
  63.         }
  64.         catch (InvalidOperationException)
  65.         {
  66.             throw;
  67.         }
  68.         Stream.Position = 0;
  69.         StreamReader sr = new StreamReader(Stream);
  70.         string str = sr.ReadToEnd();
  71.          
  72.         sr.Dispose();
  73.         Stream.Dispose();

  74.         return str;
  75.     }

  76.     #endregion
  77. }
复制代码



下面是测试代码:

1. 实体对象转换到Xml
  1. public class Student
  2. {
  3.     public string Name { set; get; }
  4.     public int Age { set; get; }
  5. }

  6. Student stu1 = new Student() { Name = "okbase", Age = 10 };
  7. string xml = XmlUtil.Serializer(typeof(Student), stu1);
  8. Console.Write(xml);
复制代码


2. Xml转换到实体对象

  1. Student stu2 = XmlUtil.Deserialize(typeof(Student), xml) as Student;
  2. Console.Write(string.Format("名字:{0},年龄:{1}", stu2.Name, stu2.Age));
复制代码


3. DataTable转换到Xml

  1. // 生成DataTable对象用于测试
  2. DataTable dt1 = new DataTable("mytable");   // 必须指明DataTable名称

  3. dt1.Columns.Add("Dosage", typeof(int));
  4. dt1.Columns.Add("Drug", typeof(string));
  5. dt1.Columns.Add("Patient", typeof(string));
  6. dt1.Columns.Add("Date", typeof(DateTime));

  7. // 添加行
  8. dt1.Rows.Add(25, "Indocin", "David", DateTime.Now);
  9. dt1.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
  10. dt1.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
  11. dt1.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
  12. dt1.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);

  13. // 序列化
  14. xml = XmlUtil.Serializer(typeof(DataTable), dt1);
  15. Console.Write(xml);
复制代码


4. Xml转换到DataTable

  1. // 反序列化
  2. DataTable dt2 = XmlUtil.Deserialize(typeof(DataTable), xml) as DataTable;

  3. // 输出测试结果
  4. foreach (DataRow dr in dt2.Rows)
  5. {
  6.     foreach (DataColumn col in dt2.Columns)
  7.     {
  8.         Console.Write(dr[col].ToString() + " ");
  9.     }

  10.     Console.Write("\r\n");
  11. }
复制代码

5. List转换到Xml

  1. // 生成List对象用于测试
  2. List<Student> list1 = new List<Student>(3);

  3. list1.Add(new Student() { Name = "okbase", Age = 10 });
  4. list1.Add(new Student() { Name = "csdn", Age = 15 });
  5. // 序列化
  6. xml = XmlUtil.Serializer(typeof(List<Student>), list1);
  7. Console.Write(xml);
复制代码

6. Xml转换到List

  1. List<Student> list2 = XmlUtil.Deserialize(typeof(List<Student>), xml) as List<Student>;
  2. foreach (Student stu in list2)
  3. {
  4.     Console.WriteLine(stu.Name + "," + stu.Age.ToString());
  5. }
复制代码


从代码可以看到,千变万化不离其宗!






上一篇:Asp.Net缓存
下一篇:webapi:ObjectContent1类型未能序列化内容类型“application/xml; charset=ut...
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-9-1 21:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表