對象的序列化是指把對象寫到一個輸出流中,對象的反序列化就是指從一個輸入流中讀取一個對象。
Java語言要求只有實現了java.io.Serializable接口的類的對象才能被序列化及反序列化。
JDK類庫中有些類(如String類、包裝類和Date類等)都實現了Serializable接口。
對象的序列化包括以下步驟
(1)創建一個對象輸出流,它可以包裝其他類型的一個輸出流,比如文件輸出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));
(2)通過對象輸出流的writeObject()方法寫對象。
out.write("hello");
out.write(new Date());
以上的代碼把一個String對象和Date對象都保存到objectFile.obj文件中了,在這個文件中保存了這兩個對象的序列化數據。這種文件無法用普通的文本編輯打開,
這種文件里的數據只有ObjectInputStream類才能識別它,并且對它進行反序列化。
對象的反序列化包括以下步驟
(1)創建一個對象輸入流,它可以包裝一個其他類型的輸入流,比如文件輸入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
(2)通過對象輸入流的readObject()方法對去對象。
String obj1 = (String)in.readObject();
Date obj2 = (Date)in.readObject();
為了能讀出正確的數據,必須保證對象輸出流對象寫對象的順序和對象輸入流讀取對象的順序一致。
下面就是一個序列化和反序列化的例子:
package test;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.Date;
public class ObjectSaver{
public static void main(String[] args) throws Exception{
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("D:\\objectFile.obj"));
String obj1 = "hello";
Date obj2 = new Date();
Customer obj3 = new Customer("Tom",20);
//序列化對象
out.writeObject(obj1);
out.writeObject(obj2);
out.writeObject(obj3);
out.close();
//反序列化對象
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("D:\\objectFile.obj"));
String obj11 = (String)in.readObject();
System.out.println("obj11:" + obj11);
System.out.println("obj11==obj1:" + (obj11==obj1));
System.out.println("obj11.equals(obj1):" + (obj11.equals(obj1)));
Date obj22 = (Date)in.readObject();
System.out.println("obj22:"+obj22);
System.out.println("obj22==obj2:" + (obj22==obj2));
System.out.println("obj22.equals(obj2):" + (obj22.equals(obj2)));
Customer obj33 = (Customer)in.readObject();
System.out.println("obj33:"+obj33);
System.out.println("obj33==obj3:" + (obj33==obj3));
System.out.println("obj33.equals(obj3):" + (obj33.equals(obj3)));
in.close();
}
}
class Customer implements Serializable{
private String name;
private int age;
public Customer(String name,int age){
this.name = name;
this.age = age;
System.out.println("call second constructor");
}
public boolean equals(Object o){
if(this==o) return true;
if(!(o instanceof Customer)) return false;
final Customer other = (Customer)o;
if(this.name.equals(other.name)&&this.age==other.age){
return true;
}else{
return false;
}
}
public String toString(){
return "name=" + name + ",age=" + age;
}
}