序列化与反序列化基本操作

一,为什么需要序列化

当程序运行时,需要访问和处理数据,在面向对象编程中,这些数据通常保存在对象中,当程序关闭或对象销毁时,这些数据需要保存到某处以便日后重建对象时能够还原对象的状态。

将对象及其状态保存起来,就称作序列化(Serialization),最简单和最常见的一种情况就是将对象及其状态保存在文件中;

而反序列化是序列化的反向操作,将文件还原为对象。

二,BinaryFormatter实现序列化

.net提供了一个接口和类如下表:


IFormatters


IFormatter中最重要的两个方法就是Serialize()和Deserialize,分别用于序列化和反序列化,由于它们接收的是Stream基类,因此可以序列化到任何流类中,而不仅限于文件流。


Formatters


命名空间提供序列化格式化程序所使用的常见枚举、接口和类。

来自 <http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.formatters(v=vs.110).aspx>


Binary


用于将序列化对象转化为二进制数据


Soap


用于将对象序列化为人类直接可读的文本格式(需添加对此Dll的引用);

//这个文本是用soap来描述的。

//SOAP全称为简单对象访问协议(simple object access Protocol),是一种轻量级的,基于XML的协议。

实现序列化代码:

注:序列化不光需要该类型是标记Serializable的,类型中的属性和字段也需要是可序列化的。

如果要序列化的对象中加入了一个不可序列化的属性,那么,序列化的时候要把它排除在外。[NonSerialized]

[NonSerialized]只能加在字段上,不能加在属性上;

结果:

三,BinaryFormatter实现反序列化

出现问题:

//Conn变成了null,

//由于conn没有进行序列化,使序列化前对象的状态和反序列化后得到的对象的状态不一致。

//.NET中提供了IDeserializationCallback接口来完成这件事。

为了避免此问题:我们使用IDserializationCallBack接口:

然后实现接口的方法:

再次运行之后,我们会发现conn不再是null了,而是一个object.

四,使用SoapFormatter类实现序列化

首先比较下与BinaryFormatter异同

1,使用方式完全相同;

2,优点:

可以跨平台;

因为SOAP是一个开放的协议,所以使用非Windows平台下的其他程序也可以处理它。

3,缺点:

SOAP是用XML来描述的,因此文件尺寸比较大。

序列化完成之后的结果,如下图所以,打开后可以看出为XML:

时间: 2024-08-24 19:34:58

序列化与反序列化基本操作的相关文章

.Net——使用DataContractJsonSerializer进行序列化及反序列化基本操作

在平常中,我们经常会用到将一个T类型的东西,序列化成Json然后返回绑定数据到页面这样一个过程.每次面试,大概都被问到怎么序列化的呀?回答总是底层封装好的,算啦,还是做个简单栗子玩玩儿吧,也好堵住面试官的嘴. 进行序列化和反序列化的时候,主要用到对象DataContractJsonSerializer,然后再配合MemoryStream,就ok啦. 不多说,先来一版简单的+泛型的栗子,之后,我们会逐步改进: public static class JsonConvert { /// <summa

二叉树的序列化和反序列化

http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍历二叉树,如果遇到空节点,就在str的末尾加上"#!","#"表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,"!"表示一个值的结束.如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".现在请你实现树的先序序列化. 先序遍历 import java.util.*; //使用递归

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

序列化与反序列化

对象的序列化,反序列化 1)对象序列化,就是将Object转化为byte序列,反之叫对象的反序列化 2)序列化流(ObjectOutputStream),是过滤流----writeObject() 反序列化流(ObjectInputStream)------readObject() 3)序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准

java序列化与反序列化

public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化.可序列化类的所有子类型本身都是可序列化的.序列化接口没有方法或字段,仅用于标识可序列化的语义. 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得.         序列化分为两大部分:序列化和反序列化.序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输.反序列

序列化与反序列化总结(Serializable和Parcelable)

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程. 在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用, 但是一旦JVM停止,这些对象的状态也就丢失了. 在实际生活中,需要将对象持久化,需要的时候再重新读取出来,通过对象序列化,可以将对象的状态保存为字节数组,需要的时候再将字节数组反序列化为对象. 对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间转换,广泛用于RMI(远程方法调用)以

Java的序列化与反序列化

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的对象传送

Python Special Syntax 8: 序列化与反序列化--&gt;华丽丽的叫 pickle(泡菜?!)

直接上代码吧 #-*-coding:utf-8 import os if os.path.exists('d:\\cpickle.data'): os.remove('d:\\cpickle.data') import cPickle as P shoplist=['apple','banana','pear'] P.dump(shoplist,file('d:\\cpickle.data','w')) f=file('d:\\cpickle.data') while True: content

lua 对表的简单序列化与反序列化

参考文档:http://blog.csdn.net/xiaodan007/article/details/7096718 function sz_T2S(_t) local szRet = "{" function doT2S(_i, _v) if "number" == type(_i) then szRet = szRet .. "[" .. _i .. "] = " if "number" == ty