java学习笔记 对象序列化
目标:
将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的java对象转换成与平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。
含义:
对象的序列化(Serialize)指将一个java对象写入IO流中,与此对应的是,对象的反序列化(Deserialize)则指的是从IO流中恢复该java对象。
方法:
为了让某个类是可序列化的,该类必须实现如下两个接口之一:
Serializable
Externalizable
Java的很多类已经实现了Serializable,该接口是一个标记接口,实现该接口无须实现任何方法,它只是表明该类的实例是可序列化的。
所有可能在网络上传输的对象的类都应该是可序列化的,否则程序会出现异常。比如RMI(Remote Method Invoke 远程方法调用,Java EE的基础)过程中的参数和返回值;所有需要保存到磁盘里的对象都必须可序列化。
因为序列化时RMI过程的参数和返回值都必须实现的机制,而RMI又是javaEE技术的基础:所有分布式应用常常需要跨平台、跨网络,因此要求所有传递的参数、返回值必须实现序列化,因此序列化机制是javaEE平台的基础。通常建议:程序创建的每个JavaBean类都实现Serializable。
需要注意的地方:
1. 反序列化机制无须通过构造器来初始化java对象。
2. 如果我们向文件中使用序列化机制写入了多个java对象,使用反序列化机制恢复对象时必须按照实际写入的顺序读取。
3. 如果一个可序列化类有多个父类(直接或间接父类),则该类的所有父类要么是可序列化的,要么有无参的构造函数---否则反序列化时会抛出InvalidClassException异常。当程序创建子类实例时,系统会隐式地为它的所有父类都创建实例(并建立和此子类的关联)。当我们反序列化某个子类的实例时,反序列化机制需要恢复其关联的父类实例。
恢复这些父类实例有两种方法:
(1) 使用反序列化机制
(2) 使用父类无参构造函数
以上两种方式,反序列化机制优先选择第一种机制。如果某个父类既不可序列化(不能使用第一种方法),又没有提供无参的构造函数(不能用第二种方法),则反序列化该子类实例时会抛出异常。、
4. 如果某个类的属性类型不是基本类型或String类型,而是另一个引用类型,则这个引用类必须是可序列化的,否则拥有该类型属性的类是不可序列化的。