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

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

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

目录
相关文章
|
4月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
55 1
|
2月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
2月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
3月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
3月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
3月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
53 2
|
2月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
63 0
|
4月前
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
51 1
|
4月前
|
存储 XML JSON
用示例说明序列化和反序列化
用示例说明序列化和反序列化
33 1
|
3月前
|
XML 安全 网络协议
Xxe外部实体注入(XML External Entity Injection)
Xxe外部实体注入(XML External Entity Injection)