.net中序列化

什么是序列化?
---.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);

时间: 2024-10-06 04:25:14

.net中序列化的相关文章

java序列化接口-java中序列化接口和parclable接口有什么区别和联系

问题描述 java中序列化接口和parclable接口有什么区别和联系 java中序列化接口和parclable接口有什么区别和联系 数据是存储到手机本地还是网络服务器啊 解决方案 Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)).实现Serializable接口非常简单,声明

Asp.Net Forums中对.Net中序列化和反序列化的应用

asp.net 在Forums中,有些内容是不固定的,例如用户资料,除了一些基本资料,可能还要有一些其他资料信息,例如MSN.个人主页.签名档等,一般对于这样的都是每一个属性对应于数据库中的一个字段.但是如果以后我们因为需要增加一些属性,例如QQ号.Blog地址等,如果还是用这种增加数据表字段的方法,那么将会频繁的修改数据库表结构.存储过程.数据库访问的程序. 或许您也遇到过类似问题,看Forums中是怎么借用.Net的序列化和反序列化来解决的:例如我需要在用户资料里面增加QQ号这个属性,那么我

有关.NET中序列化的一些知识

"序列化"可被定义为将对象的状态存储到存储媒介中的过程.在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流.在以后"反序列化"该对象时,创建原始对象的精确复本.一.为什么要选择序列化    一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本:    另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中.    例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 W

php 中序列化和json使用介绍

[序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的窗体的过程. 在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据.这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依 赖于该成员的可访问性.

解决编程中序列化问题

一.问题重现 为了重现我实际遇到的问题,我特意将问题简化,为此我写了一个简单的例子(你可以从这里下载).在下面的代码片断中,我创建了一个名称为ContextItem的类型,代表一个需要维护的上下文项.由于需要在WCF服务调用实现自动传递,我将起定义成DataContract.ContextItem包含Key,Value和ReadOnly三个属性,不用说ReadOnly表示该ContextItem可以被修改.注意Value属性Set方法的定义--如果ReadOnly则抛出异常. 1: [DataC

php 中序列化和json使用介绍_javascript技巧

[序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的窗体的过程. 在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象. 通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据.这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性.类

简单分析PHP中序列化用法介绍

0x00 序列化函数 serialize():返回带有变量类型和值的字符串 unserialize():想要将已序列化的字符串变回 PHP 的值 测试代码: <?php   class test{      var $a;      var $b;      function __construct($a,$b,$c){       $a  = $a;       $this->b = $b;          }     }         class test1 extends test{

php中序列化与反序列化在utf8和gbk编码中测试

php 在utf8和gbk编码下使用serialize和unserialize互相序列化和反序列化会出现无法成功反序列化的问题. 问题出现的原因主要是在不同编码下strlen函数计算中文字符串长度不同的原因.  代码如下 复制代码 <?php $array=array('title'=>'php教程分享网','url'=>'http://www.111cn.net'); echo serialize($array); //gbk编码  a:2:{s:5:"title"

在内存中序列化,反序列化对象实体 来完成对象实体的深拷贝

代码 using System.Runtime.Serialization.Formatters.Binary; using System.IO; using (Stream s = (Stream)(new MemoryStream())) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(s, your_obj); s.Position = 0; your_obj_next = (your_obj_type)bf.Deser