近来的项目中用到了序列化就抽空学习了一下,拿出来给大家分享一下:

  类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容:
    公共类的公共读写字段或者属性
    XmlElement对象
    XmlNode对象
    Dataset对象
    实现了Icollection 或IEnumerable的类

  该类在设计中有一个设计需求:
    需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常

  在开发过程中可能会有很多地方要用到对象和XML相互转化,在此提供一个通用的类,提供泛类型的支持。

 /// <summary>/// 序列化帮助类/// </summary>public class SHelper{/// <summary>/// 对象到XML-----泛类型/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string SaveXmlFromObj<T>(T obj){if (obj == null) return null;XmlSerializer serializer = new XmlSerializer(typeof(T));MemoryStream stream = new MemoryStream();XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);xtw.Formatting = Formatting.Indented;try{serializer.Serialize(stream, obj);}catch { return null; }stream.Position = 0;string returnStr = string.Empty;using (StreamReader sr = new StreamReader(stream, Encoding.UTF8)){string line = "";while ((line = sr.ReadLine()) != null){returnStr += line;}}return returnStr;}/// <summary>/// XML到反序列化到对象----支持泛类型/// </summary>/// <typeparam name="T"></typeparam>/// <param name="data"></param>/// <returns></returns>public static T LoadObjFromXML<T>(string data){using (MemoryStream stream = new MemoryStream()){using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8)){sw.Write(data);sw.Flush();stream.Seek(0, SeekOrigin.Begin);XmlSerializer serializer = new XmlSerializer(typeof(T));try{return ((T)serializer.Deserialize(stream));}catch { return default(T); }}}}}

  该类提供两方法,一个是从实体到返回XML字符串的方法,一个是把XML字符串装成对象实体的方法。下面我们来看看这个类是怎么用的。

首先建两个类USer和Users,User测试一个实体的序列化和反序列化,USers测试一个List集合序列化和反序列化。注意这两个类都标注了[Serializable]特性,并且提供了空参数的构造函数。

代码

[Serializable]
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public string Add { get; set; }
public int Age { get; set; }

public User()
{
this.ID = default(int);
this.Name = default(string);
this.Add = default(string);
this.Age = default(int);
}

}

[Serializable]
public class Users
{
public List<User> Datas { get; set; }
public Users()
{
this.Datas=new List<User>();
}
}

下面我们建一个页面Default.aspx,在这个页面中我们测试序列化,提供两个按钮和两个TextBox,来分别显示单个实体的序列化和List集合的序列化。

代码

<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="一个对象序列化"
onclick="Button1_Click" />
<br />
<asp:TextBox ID="TextBox1" runat="server" Width="100%" Height="200"></asp:TextBox><br />
<asp:Button ID="Button2" runat="server" Text="多个对象序列化"
onclick="Button2_Click" /><br />
<asp:TextBox ID="TextBox2" runat="server" Width="100%" Height="200"></asp:TextBox><br />
</div>
</form>

后台代码的实现:

代码

/// <summary>
/// 一个对象序列化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
User user = new User() { ID=1001,Name="小王",Add="北京",Age=21};
var str = SHelper.SaveXmlFromObj<User>(user);
this.TextBox1.Text = str;
}

/// <summary>
/// 多个对象序列化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
Users users = new Users();
User user = new User() { ID = 1001, Name = "小王", Add = "北京", Age = 21 };
users.Datas.Add(user);
users.Datas.Add(user);
users.Datas.Add(user);

var str = SHelper.SaveXmlFromObj<Users>(users);
this.TextBox2.Text = str;
}

序列化结果如下:

单对象:

<?xml version="1.0"?><User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <ID>1001</ID>  <Name>小王</Name>  <Add>北京</Add>  <Age>21</Age></User>

List集合:

<?xml version="1.0"?><Users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <Datas>    <User>      <ID>1001</ID>      <Name>小王</Name>      <Add>北京</Add>      <Age>21</Age>    </User>    <User>      <ID>1001</ID>      <Name>小王</Name>      <Add>北京</Add>      <Age>21</Age>    </User>    <User>      <ID>1001</ID>      <Name>小王</Name>      <Add>北京</Add>      <Age>21</Age>    </User>  </Datas></Users>

下面我们来测试反序列化:

首先建一个webservice,写两个测试方法:

代码

[WebMethod]
public string GetObjFromXml(string data)
{
var obj = SHelper.LoadObjFromXML<User>(data);
if (obj != null)
{ return obj.Name; }
else { return "传入数据出错"; }
}

[WebMethod]
public string GetObjsFromXml(string data)
{
var obj = SHelper.LoadObjFromXML<Users>(data);
if (obj != null)
{
string returnstr = "";
foreach (User user in obj.Datas)
{
returnstr += user.Name + "\n";
}
return returnstr;
}
else { return "传入数据出错"; }
}

编译后运行,我们用刚才序列化出来的字符串贴出参数值位置就可以测试反序列化的方法,在此不再详述,有兴趣的童鞋可以把实例代码运行。

示例代码:http://files.cnblogs.com/Clivia/SerializerHelper.rar

转载于:https://www.cnblogs.com/Clivia/archive/2010/11/27/aspnet01.html

XML和实体序列化和反序列化相关推荐

  1. C#序列化与反序列化详解

    什么是序列化以及如何实现序列化? 序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程.主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象.反向过程称为 ...

  2. Protostuff序列化和反序列化

    序列化和反序列化是在应对网络编程最常遇到的问题之一. 序列化就是将Java Object转成byte[]:反序列化就是将byte[]转成Java Object. 这里不介绍JDK serializab ...

  3. c语言xml序列化,C# XML和实体类之间相互转换(序列化和反序列化)

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

  4. XML和实体类之间相互转换(序列化和反序列化)

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

  5. c# XML和实体类之间相互转换(序列化和反序列化)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  6. XML的序列化和反序列化 详细介绍

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

  7. C# 实体类序列化与反序列化一 (XmlSerializer)

    /// <summary>/// 实体类序列化的反序列化的类/// </summary>/// <typeparam name="T">< ...

  8. C#实现对象的Xml格式序列化及反序列化

    要序列化的对象的类: [Serializable] public class Person { private string name; public string Name { get { retu ...

  9. XML序列化和反序列化(C#)

    主要参考资料: http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1 http ...

  10. jackson (json、xml的序列化与反序列化)

    jackson用于java对象到json的序列化与反序列化.还支持xml格式. jackson用于实现json与java对象的序列与反序列化.web service要实现跨机器传送对象那么就需要有一种 ...

最新文章

  1. 井下关于风速的规定_【市企融合】金川集团井下“5G+矿运卡车”远程遥控系统科研项目实验成功...
  2. 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框
  3. 解读Raw Socket
  4. synchronized原理_synchronized 关键字底层原理
  5. [转]解决xampp无法启动apache的问题
  6. MYSQL问题解决方案:Access denied for user ‘root‘@‘localhost‘ (using password:YES)
  7. linux6.5双屏显示,Redhat 6.5的系统如何设置双显示屏,急急急!
  8. python工资一般多少西安-Python面试经验分享——西安贝业思数据
  9. 移动端 H5图片裁剪插件,内置简单手势操作
  10. matlab实心黑点怎么活,matlab画实心圆点
  11. linux怎么使用西部数据,「轉」Linux下西部数据C1门解决方法
  12. EXCEL表格F4绝对引用突然失效,无反应
  13. 香农-范诺算法(Shannon-Fano coding)原理
  14. 【自学】张量、维度、多维矩阵、dim、torch.argmax()
  15. 永洪科技何春涛:中国企业数据技术的6大需求和解决之道
  16. Java毕设_装修公司业务流程管理系统的设计与实现
  17. 软件产品案例分析——福州大学微信小程序
  18. hibernate框架构建_我们如何构建服务框架而不是框架
  19. Matlab代码之plot函数的坐标点显示
  20. 变分自编码器(VAE,Variational Auto-Encoder)

热门文章

  1. 线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
  2. tomcat启动报错:java.lang.NoClassDefFoundError
  3. c# json转换实例
  4. Junit4与junt3并存时产生的问题
  5. yum更换国内源、yum下载rpm包  源码包安装
  6. Macaca自动化测试Android和IOS应用
  7. 泛函编程(7)-数据结构-List-折叠算法
  8. Software caused connection abort: socket write error 问题原因推测
  9. a small test by windows live writer 2011
  10. 17.高性能MySQL --- MySQL 分支与变种