类的XML序列化(XML Serialization)

最近做的一个ASP.NET项目中,需要在一个页面中维护一个类的数组,在每次页面刷新的使其前一次的状态保持不变。开始错误的使用了static,导致了致命的共享错误。后来突然想起C#类能够使用XML序列化出来,然后保存在XML里或者保存在页面的一个隐藏表单里(稍后再比较这两种方法的优劣)。下面来介绍这两个类序列化的应用。
保存于XML中的序列化C#类

先声明那个需要保存的类如下:

 [Serializable]
 public class HalfHour
 {
     public string ibtnHalfHourName;
     public int status;
     public bool isFirst;
     public int eventID;
     public bool isHead;

         public HalfHour()
     {
         this.ibtnHalfHourName = "";
         this.status = HalfHour.BLANK;
         this.isFirst = false;
         this.eventID = -1;
        this.isHead = false;
     }

}

然后为这个类分别定义一个Serial和Deserial两个方法,分别完成序列化和反序列化这两件事(必要的namespace是System.Xml.Serialization和System.IO):

public static void Serial(HalfHour[] halfHours, string path)
 {
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
     TextWriter writer = new StreamWriter(path);
     try
     {
         xmlSerializer.Serialize(writer, halfHours);
     }
     finally
     {
         writer.Close();
     }
 }

public static HalfHour[] Deserial(string path)
{
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
     FileStream fs = new FileStream(path, FileMode.Open);
     HalfHour[] halfHours;
     try
     {
         halfHours = (HalfHour[])xmlSerializer.Deserialize(fs);
     }
     finally
     {
         fs.Close();
     }
     return halfHours;
 }

这两个函数的调用应该很容易理解:对于Serial,你只需提供XML的保存路径和你需要序列化的那个类数组。而Deserial则只需要提供读取的XML路径即可。
保存于隐藏表单中的序列化C#类 要序列化的类的声明和上面一致,这里不再重复。但你需要在你的Web页面中定义你的隐藏表单。 下面是Serial和Deserial函数的重载版本,这里要引入System.Text的namespace:

public static string Serial(HalfHour[] halfHours)
{
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
     MemoryStream memoryStream = new MemoryStream();
     xmlSerializer.Serialize(memoryStream, halfHours);
     return Encoding.UTF8.GetString(memoryStream.GetBuffer());
 }

public static HalfHour[] Deserial(string serialedObject)
 {
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(HalfHour[]));
     MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(serialedObject));
     return (HalfHour[])xmlSerializer.Deserialize(memoryStream);
 }

两种方式的比较                选择文件读写方式显然在服务器运行速度上会比较慢,而且要构思不产生冲突的文件名,同时还要考虑文件系统的读写权限问题。写入表单则没有这个问题,但是如果序列化的对象过大的话,会是整个页面文件变得很大,造成传输过程的缓慢。所以建议如果要序列化的对象较小,则选择后者。反之则选择前者。

时间: 2024-08-29 15:53:36

类的XML序列化(XML Serialization)的相关文章

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类

[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口IXmlSerializable实现XML序列化及XML通用类 本节导读:本节主要介绍通过序列化接口IXmlSerializable实现XML序列化和反序列化,整理了XML基础操作及序列化的通用类(包括XML及节点的基础读写操作,XML到DataSet\DataTable互转换操作,XML序列化及反序列化通用方法等). 读前必备: A.类和类的实例 [.net 面向对象编程基础]  (9) 类和类的

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

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

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

我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 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> ///

c# XML和实体类之间相互转换(序列化和反序列化)[砖]

link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

XML序列化反序列化—常用类

public class XMLSerializer    {        #region (public) xml序列化        /// <summary>        /// xml序列化        /// </summary>        /// <param name="obj">obj类</param>        /// <returns>string字符串</returns>    

Xml序列化、反序列化帮助类

之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 1 /// <summary> 2 /// 功能:Xml序列化.反序列化帮助类 3 /// 说明: 4 /// 创建人: 5 /// 创建时间:2014年3月13日 6 /// </summary> 7 public static class XmlHelper 8 { 9 /// <summary> 10 ///

Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的

1 /// <summary> 2 /// Image(支持 XML 序列化) 3 /// </summary> 4 [XmlRoot("XmlImage")] 5 public class XmlImage : IXmlSerializable 6 { 7 public System.Drawing.Image Image { get; set; } 8 9 #region 构造函数 10 11 public XmlImage() 12 { } 13 14 p

C# XML序列化帮助类代码

public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding) { if (o == null) throw new ArgumentNullException("o"); if (encoding == null) throw new ArgumentNullException("encoding"

C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推荐) Newtonsoft.Json.JsonConvert类是非微软提供的一个JSON序列化和反序列的开源免费的类库(下载网址是:http://www.codeplex.com/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是.NET Framework3.5及以后