类的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 ...
随机推荐
- sea.js五分钟上手
SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架.本文给大家分享sea.js知识总结,感兴趣的朋友一起学习吧http://reactjs.cn/http://reactjs. ...
- [Angular2 Router] Redirects and Path Matching - Avoid Common Routing Pitfall
In this tutorial we are going to learn how we can can configure redirects in the angular 2 router co ...
- Linux下设置MySQL不区分大写和小写
MySQL在Linux下数据库名.表名.列名.别名大写和小写规则: 1.数据库名与表名是严格区分大写和小写 2.表的别名是严格区分大写和小写 3.列名与列的别名在全部的情况下均是 ...
- 【习题 3-1 UVA - 1585】Score
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟水题 [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] #include <bits/stdc++.h ...
- 【57.97%】【codeforces Round #380A】Interview with Oleg
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- shiro实现登录安全认证(转)
shiro实现登录安全认证 shiro的优势,不需要再代码里面判断是否登录,是否有执行的权限,实现了从前端页面到后台代码的权限的控制非常的灵活方便 传统的登录认证方式是,从前端页面获取到用户输入的账号 ...
- MyCAT分表初体验
1.mycat二进制包安装 下载地址:http://dl.mycat.io/ tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar ...
- js获取图片的尺寸
$("<img/>").attr("src", "http://www.example.com/images/bag001.jpg&quo ...
- 《SPA设计与架构》之认识SPA
原文 简书原文:https://www.jianshu.com/p/84323f530223 大纲 前言 1.什么是单页面应用程序(SPA) 2.SPA与传统Web应用的区别 3.关于SPA的使用 4 ...
- spring-如何在项目启动的情况下获取Bean实例
十年阿里,就只剩下这套Java开发体系了 >>> 大家都知道,项目启动的时候,spring读取xml文件,将配置的bean 或者 注解下的controller service d ...