再看序列化与反序列化[转]
原文出处
代码下载(VS2010Beta2工程)
序列化就是将内存中的对象保存成可存或可传的形式。一般情况下,对象是根据类被实例化到托管堆上的,一旦进程退出,整个对象被释放掉,如果再次实例化类,所得的对象,与先前的对象状态是不一样的,为此,序列化就成为一个有效的解决方式。
下面先看一个例子:
新建一个WinForm项目,在Form1窗体上放两个Button,分别为Button1和Button2。
在Form1对应的cs代码中,引入下列命名空间:
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Permissions;
然后添加下面两个类:
public class Person
{
public bool sex;
}
[Serializable]
public class Chinese : Person,ISerializable
{
public string complexion;
public Chinese()
{ }
public Chinese(SerializationInfo info, StreamingContext context)
{
sex = info.GetBoolean("sex");
complexion = info.GetString("complexion");
}
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("sex", sex);
info.AddValue("complexion", complexion);
}
}
再处理两个Button的单击事件订阅的方法:
//序列化XiaoHong对象
private void button1_Click(object sender, EventArgs e)
{
Chinese XiaoHong = new Chinese();
XiaoHong.sex = true ;
XiaoHong.complexion = "Yellow";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("F:/xh.bin", FileMode.Create, FileAccess.Write, FileShare.None); ;
formatter.Serialize(stream, XiaoHong);
stream.Close();
}
//反序列化XiaoHong对象
private void button2_Click(object sender, EventArgs e)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("F:/xh.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
Chinese XiaoHong = (Chinese)formatter.Deserialize(stream);
stream.Close();
MessageBox.Show(string.Format("性别:{0},肤色:{1}", XiaoHong.sex, XiaoHong.complexion));
}
其实序列的用法相对简单,在这里,要说两个地方,一个是GetObjectData引入的属性[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)],这是一个设置数据访问的权限属性。另一个是GetObjectData的两个参数SerializationInfo info和 StreamingContext context,其中info是保存序列化对象中数据的类,context是对序列化流的描述。可能这时候不明白这些属性,下来,说一下序列化的本质吧。
这要从C#面向对象的类说起,我们知道,在类中,成员有字段,属性,方法,索引器,操作符,内部类等,但这些东西,最终都可以归为两大类,一种就是存数据的,一种就是执行功能的。在类成员中,存数据的,就是字段了(属性其实不是用来存放数据的,属性是由get和set两个方法封装成的),其他的成员,都是用来完成一定功能。完成功能的在类成员中,方法是比较常见的。
为什么要说类成员呢?因为在对象序列化时,保存的只有数据,而功能是不保存的。我们如果把序列化后的文件xh.bin用文本打开,内容如下:
OWindowsFormsApplication3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null WindowsFormsApplication3.Chinese sex
complexion Yellow
从上面的文件可看出,有两个字段sex和complexion,这两个是字段,是用来存储的数据项,所以在序列化过程中是只保存对象的数据,至于方法,是不保留的,因为在对象的生存周期内,方法是不变的,所以在返序列化过程中,方法可以从类中得到,而数据则是从文件中得到。还要注意的一点是,我们在做序列化类的时候,提到过一个SerializationInfo info的一个参数,正是这个info,把类中的字段数据当成一个整体,保存了下来,即GetObjectData方法内的代码。在反序列化过程中,正要进行上面相反的过程,反序列是对象重现的过程,所以在类的构造函数中,把字段数据从info中取出来,赋给字段,完成对象的重现。
总结一句话,序列化就是把对象中的数据按一定规则组织成文件存储或组织成网络流进行传输(Remoting中用到)。
转载于:https://www.cnblogs.com/Sunwayking/articles/1598488.html
再看序列化与反序列化[转]相关推荐
- 利用JavascriptSerializer类 进行Json对象的序列化和反序列化
1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...
- 深入分析Java的序列化与反序列化
阅读目录 Java对象的序列化 如何对Java对象进行序列化与反序列化 序列化及反序列化相关知识 ArrayList的序列化 ObjectOutputStream 总结 序列化是一种对象持久化的手段. ...
- 在C#中,Json的序列化和反序列化的几种方式总结
在C#中,Json的序列化和反序列化的几种方式总结 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象. 什么是JSON? JSON (Ja ...
- Java基础学习总结——Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- 开心网外挂开发之 XML序列化于反序列化
通过昨天的文章我们已经了解了开发一个开心网的外挂所需要的最基本的东本,接下来的工作可以说基本上就上围绕这个基础来进行的,我写这一系列文章主要的目地不仅仅是为了让大家了解怎么开发开心网外挂,最主要的目过 ...
- 面试:什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决?...
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | riemann_ 来源 | blog.csdn ...
- Java基础学习总结(14)——Java对象的序列化和反序列化
2019独角兽企业重金招聘Python工程师标准>>> 一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象 ...
- 序列化与反序列化_序列化和反序列化JAVA成长之路
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化.把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放 ...
- 序列化和反序列化的对单例破坏的防止及其原理
首先我们来看一下序列化和反序列化是怎么破坏单例的.看代码 public class HungrySingleton implements Serializable{private final stat ...
最新文章
- React + Koa 实现服务端渲染(SSR)
- 多层AOP 解决AOP执行顺序
- python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
- Windows下给SourceTree配置外部比较工具BeyondCompare
- 微信小程序 调用地图接口,实现定位
- ThinkPHP 3.2 DEMO案例系列【phpmailer批量发送邮件】
- 跑通LSD-SLAM
- Widget改变大小
- 程序员进阶必备--写文档
- excel IRR利率函数公式,算利率
- y的花式写法_y的花式写法_26个字母的花式写法,总有一个你喜欢哒
- 计算机教学问卷调查,信息技术在数学课堂教学中的应用:数学课堂信息技术应用调查问卷...
- 小数阶乘怎么用c语言计算器,自编科学计算器 支持多次方 多次开放 阶乘 部分数学函数...
- 一个具有一些功能的网络画图板
- JAVA AIO编程
- 项目管理之如何做好项目经理
- 有一条长阶梯:如果每步跨 2阶,那么最后剩 1 阶;如果每步跨 3 阶,那么最后剩 2 阶;如果每步跨 5 阶,那么最后剩 4 阶;如果每步跨 6 阶,那么最后剩 5 阶;只有当每步跨 7 阶时,最后
- Nmap入门:隐私刺探
- 如何让Js代码只执行一次
- 1870899-46-9,DBCO-PEG5-acid,DBCO-PEG5-COOH,二苯并环辛炔-五聚乙二醇-羧酸
热门文章
- 你见过最“变态”的CPU散热器是什么样的?
- ETC因背胶问题脱落,如何重新激活?
- 以太坊PoA共识引擎算法介绍(1)
- 论文Attention-guided CNN for image denoising解读
- Navicat Premium 12快捷键
- fn_dblog_如何使用fn_dblog和fn_dump_dblog直接在SQL Server数据库中连续读取事务日志文件数据
- SQL Server 2019中的证书管理
- 使用SSIS包导入SQL Server FILESTREAM数据
- ssms的导入功能_SSMS 17中的新增功能; PowerShell和DAX
- 数据库水平拆分和垂直拆分区别(以mysql为例)