最近做的一个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);
}

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

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

  1. C# 派生类的XmlSerializer序列化XML

    近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...

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

    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...

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

    link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...

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

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...

  5. .NET(C#):XML序列化时派生类的处理

    原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序 ...

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

    我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  8. C#工具类之Xml序列化扩展类

    using System; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.T ...

  9. 六、用DataContractSerialize类序列化XML

    一.层次结构 基类:XmlObjectSerializer 派生类: DataContractSerializer NetDataContractSerializer DataContractJson ...

随机推荐

  1. 【例题 6-19 UVA - 1572】Self-Assembly

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 旋转和翻转,会发现. 如果可以顺着某个方向一直放的话. 总是能转换成往下或者往右连的. 则只要能够出现一个连接顺序的循环,则总是有解 ...

  2. Android Studio插件推荐-GsonFormat,ButterKnifeZelezny

    原创文章.转载请注明 http://blog.csdn.net/leejizhou/article/details/50557786 本篇介绍的仅仅适用android studio和 Intellij ...

  3. stm32的adc时钟周期,ADC_SampleTime_1Cycles5是多长时间

  4. 最小生成树(MST)求解旅行商问题

    从当前位置开始(也可以不指定起始位置),访问完所有未访问的端点后返回起始点的最短路径就是连接所有端点的生成树.最小生成树需保证: 每条边最多只能被选 1 次: 抹掉所有未被选择的边时,图形不能分为上下 ...

  5. 关于用strace工具定位vrrpd进程有时会挂死的bug

    只做工作总结备忘之用. 正在烧镜像,稍总结一下进来改bug遇到的问题. 一个项目里要用到L3 switch的nat,vrrp功能,但实地测试中偶然出现write file挂死的情况,但不是必现.交付在 ...

  6. java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

    1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包  [commons-beanutils-1.8.0.jar.commons-c ...

  7. 怎样实现iMessage群发

    怎样实现iMessage群发 Apple公司全线在mac os与ios两个操作系统上内置了FaceTime与iMessage两个应用.完美替代运营商的短信与电话.并且FaceTime与iMessage ...

  8. iOS开发Block的介绍以及Block的循环引用问题

    1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[ ...

  9. Hibernate之HQL检索(查询)方式

    HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能 ...

  10. 于 Android NDK 的学习之旅-----数据传输(基本数据类型和数组传输)

    之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用.因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识. 数据传输可分为 基本数据类型传输 和 引用数 ...