什么是序列化?
---.net的运行时环境用来支持用户定义类型的流化的机制。
它是将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
序列化的目的:
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。
在.net框架里提供了这样两个类:
一、BinaryFormatter
BinaryFormatter使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的 Serialize 方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为 private 的变量)都将被序列化。
首先我们创建一个类:
[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
Serializable属性用来明确表示该类可以被序列化。同样的,我们可以用NonSerializable属性用来明确表示类不能被序列化。
接着我们创建一个该类的实例,然后序列化,并存到文件里持久:
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "一些字符串";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
而将对象还原到它以前的状态也非常容易。首先,创建格式化程序和流以进行读取,然后让格式化程序对对象进行反序列化。
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open,
FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();
// 下面是证明
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
二、SoapFormatter
前面我们用BinaryFormatter以二进制格式来序列化。很容易的我们就能把前面的例子改为用SoapFormatter的,这样将以xml 格式化,因此能有更好的可移植性。所要做的更改只是将以上代码中的格式化程序换成 SoapFormatter,而 Serialize 和 Deserialize 调用不变。对于上面使用的示例,该格式化程序将生成以下结果。
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile">
(http://www.pconline.com.cn/pcedu/empolder/net/0405/368027.html)(摘抄)
分享到:
相关推荐
第二部分(6~17章)则对.NET中的关键知识点进行了深入剖析,如程序集、流和序列化、加密与解密、网络编程、.NET Remoting、在.NET中操作XML、.NET应用程序配置、基于角色的安全性、反射、多线程、对象生存期与垃圾...
第二部分(6~17 章)则对.NET 中的关键知识点进行了深入剖 析,如程序集、流和序列化、加密与解密、网络编程、.NET Remoting、在.NET 中操作XML、.NET 应 用程序配置、基于角色的安全性、反射、多线程、对象生存期与...
第二部分(6~17 章)则对.NET 中的关键知识点进行了深入剖 析,如程序集、流和序列化、加密与解密、网络编程、.NET Remoting、在.NET 中操作XML、.NET 应 用程序配置、基于角色的安全性、反射、多线程、对象生存期与...
序列化与反射 8. Video 教学 Video: 演示 新闻阅读器 功能 9. 附录 类库中主要命名空间 数据结构 10. 指导学习 DLC 1 DLC 2 DLC 3 11. 在线培训 无 12. 项目案例 影院售票 13. 阶段...
内含知识文档,学习视频,ppt,示例(原代码),非常好!!!!!!
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
S2深入.NET平台课程总复习: (1)使用继承、接口技术实现一个计算机信息查看功能; (2)使用序列化技术实现对象的保存和读取。
泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...
使用继承、接口技术实现一个计算机信息查看功能。 使用序列化技术实现对象的保存与读取。(源代码及窗体)
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记
全套资源下载地址:...深入强化学习 神经网络(RNN) 梯度下降 为什么要做深度学习 无监督学习:词嵌入word2vec 无监督学习:深度自动编码器 无监督学习:线性降维 无监督学习:相邻嵌入 序列标记