IO-序列化 Serializable Parcelable Object
简介
1、什么是序列化和反序列化对象的寿命通常随着生成该对象的程序的终止而终止,有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种,能记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的序列化或串行化(Serialization) 。序列化的主要任务是记录对象实例变量的数值,如果变量是另一对象的引用,则引用的对象也要序列化,这个过程是递归的。序列化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。简单说,Serialization是一种将【对象】以一连串的字节进行描述的过程,而反序列化是一种将这些字节重建成一个对象的过程。2、什么情况下需要序列化
- 当你想把的【内存】中的对象保存到一个文件中或者数据库中时候;
- 当你想用套接字在网络上【传送】对象的时候;
- 当你想通过RMI【传输】对象的时候;
另一种描述:
- 作为一种持久化机制 如果使用的是FileOutputStream流的方式,则数据将被自动地写入文件中,
- 作为一种复制机制 如果使用的是ByteArrayOutputStream流的方式,数据将写入内存中的字节数组中。该字节数组可以用来创建初始对象的副本,
- 作为一种通信机制 如果是使用套接字(Socket)流的方式,则数据自动地通过网络连接传输一另一个端点,并由这个端点上的程序来决定做什么。
3、如何实现序列化、反序列化将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。如果我们想要序列化一个对象,首先要创建字节输出流OutputStream(如FileOutputStream、ByteArrayOutputStream等),并将这些OutputStream封装在一个【ObjectOutputStream】中。然后只需调用其writeObject()方法就可以将对象序列化,并将其发送给OutputStream。如果我们想要反序列化为一个对象,需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在【ObjectInputStream】内,然后调用其readObject()即可。
4、序列化的serialVersionUID序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 long 类型的1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成)。在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功,因为不同的序列化id之间不能进行序列化和反序列化,这也可能是造成序列化和反序列化失败的原因。5、序列化前后,对象的关系反序列化还原生成的对象与原来的对象的地址不同,但是内容是一样的,而且对象中包含的引用也相同。换句话说,通过序列化操作,我们可以实现对任何可Serializable对象的【深度复制】——这意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。对于同一流的对象,他们的地址是相同,说明他们是同一个对象,但是与其他流的对象地址却不相同。也就说,只要将对象序列化到单一流中,就可以恢复出与我们写出时一样的对象网,而且只要在同一流中,对象都是同一个。6、静态变量能否序列化静态成员属于类级别的,所以不能序列化,即序列化的是对象的状态不是类的状态。这里的不能序列化的意思,是序列化信息中不包含这个静态成员域。7、总结
- a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
- b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化(引用对象也要实现Serializable接口);
- c)static,transient后的变量不能被序列化;
序列化对象的两种方式
1、Serializable实现步骤
- ①业务Bean实现Serializable接口,写上getter和setter方法
- ②Intent通过调用putExtra(String name, Serializable value)传入对象实例,当然对象有多个的话,我们也可以先Bundle.putSerializable(x,x);
- ③ Intent通过调用getSerializableExtra()方法获得对象实例
- ④调用对象get方法获得相应参数
2、Parcelable实现步骤
- ①业务Bean实现Parcelable接口,重写writeToParcel方法,将你的对象序列化为一个Parcel对象
- ②重写describeContents方法,内容接口描述,默认返回0就可以了
- ③实例化Parcelable.Creator<T> 类型的静态内部对象CREATOR,实现接口Parcelable.Creator,重写createFromParcel方法和newArray方法
- ④同样式通过Intent的putExtra()方法传入对象实例,或通过Bundle传递多个实例
3、Serializable,Parcelable这两种序列化方式的比较
- a)在使用内存方面,Parcelable比Serializable性能高,所以推荐使用Parcelable。
- b)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
- c)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性;在外界有变化的情况下,建议使用Serializable。
测试代码
生成的文件:文件中的内容(乱码):
打印的内容:
![]()
public class Demo { public static void main(String[] args) throws IOException, ClassNotFoundException {writeObj();readObj();}//序列化public static void writeObj() throws FileNotFoundException, IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("e:/bqt.object"));Person person = new Person("包青天",26);objectOutputStream.writeObject(person);//把对象输出成Byte流保存起来objectOutputStream.flush();objectOutputStream.close();}//反序列化public static void readObj() throws ClassNotFoundException, FileNotFoundException, IOException {ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("e:/bqt.object"));Person person = (Person) objectInputStream.readObject();//将字节重建成一个对象System.out.println(person.getName() + ":" + person.getAge());objectInputStream.close();}}
IO-序列化 Serializable Parcelable Object的更多相关文章
- JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码
JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个 ...
- 序列化Serializable和Parcelable
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下序列化Serializable和Parcelable的使用方法. Android中Intent如果要传递类对象,可以通过两 ...
- Android-序列化-Serializable/Parcelable
Android-序列化-Serializable/Parcelable 学习自 <Android开发艺术探索> 序列化漫谈 IPC的首要目的是传输数据,当然不能仅仅是传输一些基础数据了,毕 ...
- Java 序列化Serializable详解
Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
- 序列化---Serializable与Externalizable源码
Serializable接口总结: 1. java.io.Serializable接口是一个标识接口,它没有任何字段和方法,用来表示此类可序列化: 2. 父类声明该接口,则其与其所有子类均可序列化,都 ...
- Java 序列化Serializable具体解释(附具体样例)
Java 序列化Serializable具体解释(附具体样例) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描写叙述的过程:反序列化deserializa ...
- java 序列化Serializable 详解
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...
- JavaSE-20 IO序列化
学习要点 定义 IO如何序列化 序列化 序列化:是将对象的状态存储到特定存储介质中的过程. 反序列化:从特定存储介质中的数据重新构建对象的过程. 实现了java.io.Serializable接口的类 ...
随机推荐
- 记录GDI 文本的设置
需要说明的是,在GDI+中,我们可以通过SetTextRenderingHint来控制文本输出的质量.例如下面的代码,其结果如图7.15所示. Graphics graphics( pDC->m ...
- asp.net 调用天气所遇到的问题
由于在项目用了显示天气的功能,原有的调用方法 直接通过 <iframe name="weather_inc" src="http://i.tianqi.c ...
- shell脚本中的括号和实例
1.单圆括号和双圆括号 “双圆括号”命令允许将高级的数学表达式放入比较中.格式如下: (( expression )) 除了 test命令(if-then [])使用的标准数学运算符外, 双圆括号还支 ...
- SqlServer 还原,备份 Sql脚本命令
备份 USE master go ),); set @path='d:\backup\'; set @name=@path+'TsDb.bak'; Backup database TsDb To di ...
- Javascript图片轮播
原文链接:http://www.imooc.com/article/7393 编辑HTML代码: <div id="wrap"><!--图片展示区--> & ...
- JS之路——常用正则表达式
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$".只能输入至少n位的数 ...
- 转:cookie和session(一)——原理
文章来自于:http://blog.csdn.net/half1/article/details/21645545 一.cookie和session是什么? cookie是服务器留在客户端中的小文 ...
- 查看堵塞的SQL
SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.t ...
- DLL入门浅析(4)——从DLL中导出类
转载自:http://www.cppblog.com/suiaiguo/archive/2009/07/20/90663.html 前面介绍了怎么从DLL中导出函数和变量,实际上导出类的方法也是大同小 ...
- String的equals方法和==
String类的对象是字符串常量,一切看起来改变了String对象的操作,其实只是改变了字符串引用变量所引用的字符串罢了. Java中的字符串存放在一个公共的存储池中,引用指向存储池中相应的位置,编译 ...
文件中的内容(乱码):
打印的内容: