一起谈.NET技术,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" 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 "传入数据出错"; }
}

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

时间: 2024-10-03 21:14:36

一起谈.NET技术,XML和实体序列化和反序列化的相关文章

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序列化与反序列化 //

一起谈.NET技术,C#序列化与反序列化(Serializable and Deserialize)

     序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本.      我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据.尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂.可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象

一起谈.NET技术,ASP.NET 中JSON 的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号'{}',中

一起谈.NET技术,Silverlight 应用整合

Silverlight与企业信息化 在企业应用系统中,企业客户不在满足于呆板的Portal.树形结构.数据堆积的表格和满屏的文字描述.企业客户越来越倡导用户体验,Silverlight迎合了这种需求,实现了炫目的体验和丰富交互的应用,更重要的是Silverlight更适合企业应用系统的开发,依靠.Net平台,使用C#高级语言代替JavaScript脚本语言,实现了强大的客户端计算能力.支持多线程,丰富的控件.特效与动画,更可控的浏览器适应性,更安全的沙箱模式,客户端嵌入式数据库等. 现在企业应用

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

对象|集合|数据 通过序列化和反序列化泛型数据实体集合来实现持久化数据对象的方法 我们在平时使用数据库的时候,经常会碰到一个问题,就是不希望数据实体对象插入数据库中, 却有想持久化的时候,那么就可以用序列化成 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的计数器实例.这样,关机时序列化它,开机时反序列化它,每次开机都是延续的.不会都是从头开始. 序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便