XML和实体序列化和反序列化

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

  类为我们提供了自己对象串行化(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" W
idth="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 = "";

for
each (User user in obj.Datas)

{

returnstr += user.Name + "\n";

}

return returnstr;

}

else { return "传入数据出错"; }

}

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

时间: 2024-10-24 13:32:35

XML和实体序列化和反序列化的相关文章

一起谈.NET技术,XML和实体序列化和反序列化

近来的项目中用到了序列化就抽空学习了一下,拿出来给大家分享一下: 类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容: 公共类的公共读写字段或者属性 XmlElement对象 XmlNode对象 Dataset对象 实现了Icollection 或IEnumerable的类 该类在设计中有一个设计需求: 需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常 在开发过程中可能会有很多地方要用到对象和XML相互转化,

C# XML和JSON 序列化与反序列化

1.JSON的序列化与反序列化     JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,它虽然是JavaScript的一个子集,但它是独立于语言的文本格式.它的数据格式比较简单,易于读写,且都是压缩的,占用带宽小且易于解析,通常会用JSON格式来传输数据或者用于数据存储.有关JSON数据结构语法的更多知识大家可以在网上其它的地方进行了解,我们只要记住在服务端向客户端传输数据时经常使用它,然后对它的序列化和反序列化非常值得了解就ok了.序列化的过程就是把

C#实现XML与实体类之间相互转换的方法(序列化与反序列化)_C#教程

本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法

对象|集合|数据 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法 我们在平时使用数据库的时候,经常会碰到一个问题,就是不希望数据实体对象插入数据库中, 却有想持久化的时候,那么就可以用序列化成 XML字符串,来保存到其他地方,由于生成的是字符串,所以可以保存到任意我们想保存的地方.比如 asp.net的ViewState,cookie,cache等. 首先,我们定义一个数据实体类.     class Entity    {        public Entity()     

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

/// <summary> /// 实体类序列化的反序列化的类 /// </summary> /// <typeparam name="T"></typeparam> public abstract class EntityClassXmlSerializer<T> { /// <summary> /// 实体类序列化成xml string /// </summary> /// <param na

.NET对象的XML序列化和反序列化

 序列化的概念 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串"2"表示.如果有个对象,叫做connter,当前值为2,那么可以序列化成"2",反向的,也可以从"2"得到值为2的计数器实例.这样,关机时序列化它,开机时反序列化它,每次开机都是延续的.不会都是从头开始. 序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便

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

xml|对象   要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name;}set{name=value;}}public string Sex;public int Age=31;public Course[] Courses; public Person(){}public Person(string Name){name=Name;Sex="男&q

对象的序列化与反序列化,以xml,二进制流的方式,soap方式序列化对象

  System.Runtime.Serialization.Formatters.Soap 命名空间包含SoapFormatter 类,该类用于以SOAP 格式将对象序列化和反序列化.生成使用此命名空间中的类型的应用程序时,必须引用System.Runtime.Serialization.Formatters.Soap.dll 程序集.   using System;using System.Drawing;using System.Collections;using System.Windo

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

jackson用于java对象到json的序列化与反序列化.还支持xml格式. jackson用于实现json与java对象的序列与反序列化.web service要实现跨机器传送对象那么就需要有一种技术能把对象转换为特定格式的信息.为了实现跨平台(比如把java对象转化为c#或c++对象),又考虑到方便人们阅读,所以基于字符串规则的转换是最理想的.json就是这样一个轻量级的数据交换格式,而jackson是一个实现该功能的很好用的框架. 1.获得 <dependency> <group