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

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

目录
相关文章
|
6天前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
11 0
|
15天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
15天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
15天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
15天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
15天前
|
开发框架 .NET 开发者
【专栏】领略.NET 技术的创新力量
【4月更文挑战第29天】.NET技术自ASP.NET起历经创新,现以.NET Core为核心,展现跨平台能力,提升性能与生产力,支持现代化应用架构。.NET Core使开发者能用同一代码库在不同操作系统上构建应用,扩展至移动和物联网领域。性能提升,C#新特性简化编程,Roslyn编译器优化代码。拥抱微服务、容器化,内置安全机制,支持OAuth等标准。未来.NET 6将引入更快性能、Hot Reload等功能,预示着.NET将持续引领软件开发潮流,为开发者创造更多机会。
|
15天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
15天前
|
人工智能 前端开发 Cloud Native
【专栏】洞察.NET 技术的开发趋势
【4月更文挑战第29天】本文探讨了.NET技术的三大发展趋势:1) 跨平台与云原生技术融合,通过.NET Core支持轻量级、高性能应用,适应云计算和微服务;2) 人工智能与机器学习的集成,如ML.NET框架,使开发者能用C#构建AI模型;3) 引入现代化前端开发技术,如Blazor,实现前后端一致性。随着.NET 8等新版本的发布,期待更多创新技术如量子计算、AR/VR的融合,.NET将持续推动软件开发的创新与进步。
|
15天前
|
人工智能 前端开发 Devops
【专栏】洞察.NET 技术在现代开发中的作用
【4月更文挑战第29天】本文探讨了.NET技术在现代软件开发中的核心价值、应用及挑战。.NET提供语言统一性与多样性,强大的Visual Studio工具,丰富的类库,跨平台能力及活跃的开发者社区。实际应用包括企业级应用、Web、移动、云服务和游戏开发。未来面临性能优化、容器化、AI集成等挑战,需持续创新。开发者应深入理解.NET,把握技术趋势,参与社区,共创美好未来。
|
15天前
|
开发工具 C# 开发者
【专栏】理解.NET 技术,开创美好未来
【4月更文挑战第29天】本文探讨了.NET技术在软件开发中的关键作用,强调其核心优势,如语言多样性、丰富类库、强大的开发工具和跨平台能力。.NET在现代应用开发中涉及企业级应用、云服务集成、微服务、移动应用和游戏开发。未来,.NET将持续创新,提升性能,拓展应用场景,并促进更紧密的社区合作,通过跨平台框架扩大应用范围。开发者应深入学习.NET,抓住技术趋势,共创美好未来。

热门文章

最新文章

相关课程

更多