序列化:指将对象的状态数据以字节流的形式进行处理,在文件中长期存储。
反序列:从字面上就能知道,指的就是在须要的时候从文件中获取该对象的信息以从新得到一个彻底的对象。java
(1)永久性保存对象,把对象经过序列化字节流保存到本地文件中。
(2)经过序列化在网络中传递对象
(3)经过序列化在进程间传递对象数组
(1)Serializable接口
(2)Externalizable接口:该接口继承了Serializable接口,是对Serializable的扩展,并提供了readExternal(ObjectInput in)和writeExternal(ObjectOutout out)两种方法,经过重写这两个方法来实现自身的序列化行为的控制。在对实现了Externalizable的类的对象进行反序列化时,会先调用该类的无参构造函数,若无参构造函数被删除或被设置为private、default或protected时会抛出Java.io.InvalidException:no valid construction等网络
1)序列化实现步骤:
(1)须要序列化的对象所属类必须实现Serializable接口;
(2)构造FileOutputStream对象;
(3)构造ObjectOutputStream对象;
(4)使用ObjectOutputStream对象的writeObject()方法进行序列化;
(5)关闭ObjectOutputStream对象;
(6)关闭FileOutputStream对象;
(7)对序列化全程捕获IOException;ide
2)反序列化实现步骤:
(1)须要序列化的对象所属类必须实现Serializable接口;
(2)构造FileInputStream对象;
(3)构造ObjectInputStream对象;
(4)使用ObjectInputStream对象的readObject()方法进行反序列化;
(5)关闭ObjectInputStream对象;
(6)关闭FileInputStream对象;
(7)对序列化全程捕获ClassNotFoundException和IOException;函数
3)注意:
1. 只有实现了Serializable或Externalizable的类的对象才能够实现序列化。
2. 对象和对象数组均可以实现序列化
3. 若一个父类实现了Serializable或Externalizable接口,其子类均实现了Serializable或Externalizable接口。
4. 实现Serializable或Externalizable接口的类应提供无参构造函数
5. static的属性和方法不能被序列化,由于static的属性和方法与对象无关,而序列化和反序列化则是针对对象而言的。
6. 对于不但愿被序列化的非static成员和方法能够使用transient关键字标明.(关于transient关键字的用法参考博文Java的transient关键字)
7.若一个序列化子类的父类是非序列化的,则该子类从父类继承下来的变量将恢复其默认初始值而不被初始化。this
package effectivejava; import java.io.*; import java.util.Date; /** * Created by louyuting on 16/11/11. * 序列化与反序列化 */ class Customer implements Serializable{ private String name; private String age; public Customer() { } public Customer(String age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "name=" + this.name + ", age="+this.age; } } public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //获取序列化对象 ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/opt/objectFile.obj")); Customer customer = new Customer("娄宇庭", "24"); out.writeObject("你好!"); out.writeObject(new Date()); out.writeObject(customer); out.close(); //反序列化对象 ObjectInputStream in = new ObjectInputStream(new FileInputStream("/opt/objectFile.obj")); System.out.println("obj1:"+ (String)in.readObject()); System.out.println("obj2:"+ (Date)in.readObject()); System.out.println("obj3:"+ (Customer)in.readObject()); in.close(); } }