类的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);
}
两种方式的比较 选择文件读写方式显然在服务器运行速度上会比较慢,而且要构思不产生冲突的文件名,同时还要考虑文件系统的读写权限问题。写入表单则没有这个问题,但是如果序列化的对象过大的话,会是整个页面文件变得很大,造成传输过程的缓慢。所以建议如果要序列化的对象较小,则选择后者。反之则选择前者。
类的XML序列化(XML Serialization)的更多相关文章
- C# 派生类的XmlSerializer序列化XML
近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- c# XML和实体类之间相互转换(序列化和反序列化)[砖]
link: http://blog.okbase.net/haobao/archive/62.html by: 好饱 我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlU ...
- C# XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. using System; using System.Collections.Ge ...
- .NET(C#):XML序列化时派生类的处理
原文 www.cnblogs.com/mgen/archive/2011/12/03/2275014.html 目录 1. 针对基类的XmlSerializer序列化派生类 2. 类内成员是派生类的序 ...
- XML和实体类之间相互转换(序列化和反序列化)
我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- C#工具类之Xml序列化扩展类
using System; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.T ...
- 六、用DataContractSerialize类序列化XML
一.层次结构 基类:XmlObjectSerializer 派生类: DataContractSerializer NetDataContractSerializer DataContractJson ...
随机推荐
- Maven学习总结(17)——深入理解maven灵活的构建
一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建.maven为了支持构建的灵活性,内置了三大特性,即:属性.profile和资源过滤. 1.maven属性 maven属性分6类 ...
- 卡塔兰数(Catalan)
卡塔兰数(Catalan) 原理: 令h(0)=1,h(1)=1. 卡塔兰数满足递推式:h(n)=h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)(n>=2) ...
- 9.6 Binder系统_驱动情景分析_server的多线程实现
当多个client对server发出请求的时候,如果server忙不过来的时候会创建多线程来处理请求 那么忙不过来由谁来判断? server进程有个binder_proc结构体,其里面有todo链表( ...
- PatentTips - Enhanced I/O Performance in a Multi-Processor System Via Interrupt Affinity Schemes
BACKGROUND OF THE INVENTION This relates to Input/Output (I/O) performance in a host system having m ...
- [TypeStyle] Use fallback values in TypeStyle for better browser support
You can increase the browser support of your CSS using fallback values and vendor prefixes. This les ...
- Xcode5新特性之注释
Xcode5新特性之注释 Xcode5在注释式文档方面也有进步,越来越象javadoc. Xcode4 参考一下教程 http://blog.chukong-inc.com/index.php/201 ...
- <Linux> Xen虚拟机镜像的安装
了解系统安装在哪个磁盘上:fdisk -l 建立存放虚拟机镜像的目录:mkdir /mnt/vmx 更改文件系统格式: mkfs -t ext4 /dev/sda或者/dev/sdb(系统不在的那个硬 ...
- Android java.lang.IllegalStateException: Already logged in to server.
今晚在搞openfire时,无意中发现了这样的一个问题:问题描述: java.lang.IllegalStateException: Already logged in to server.原因:wh ...
- php标准库中的优先队列SplPriorityQueue怎么使用?(继承)
php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...
- Erlang 进制转换
http://www.cnblogs.com/me-sa/archive/2012/03/20/erlang0047.html bnot unary bitwise not integer div i ...