IO流的序列化和反序列化
序列化和反序列化的概念:
序列化:把對象轉換為字節序列的過程稱為對象的序列化。(常見的就是存文件)
反序列化:把字節序列恢復為對象的過程稱為對象阿德反序列化。
序列化和反序列化的使用:
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,並將其返回。
只有實現了Serializable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自 Serializable接口,實現Externalizable接口的類完全由自身來控制序列化的行為,而僅實現Serializable接口的類可以 采用默認的序列化方式 。
關於接口 Serializable的描述:
類通過實現 java.io.Serializable 接口以啟用其序列化功能。
未實現此接口的類將無法使其任何狀態序列化或反序列化。
可序列化類的所有子類型本身都是可序列化的。因為實現接口也是間接的等同於繼承。
序列化接口沒有方法或字段,僅用於標識可序列化的語義。
對象序列化包括如下步驟:
1) 創建一個對象輸出流,它可以包裝一個其他類型的目標輸出流,如文件輸出流;
2) 通過對象輸出流的writeObject()方法寫對象。
對象反序列化的步驟如下:
1) 創建一個對象輸入流,它可以包裝一個其他類型的源輸入流,如文件輸入流;
2) 通過對象輸入流的readObject()方法讀取對象。
代碼:
ObjectOutputStream代表對象輸出流:
它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
ObjectInputStream代表對象輸入流:
它的readObject()方法從一個源輸入流中讀取字節序列,再把它們反序列化為一個對象,並將其返回。
定義Person類,實現Serializable接口
import java.io.Serializable; public class Demo1Person implements Serializable{ public String name; //禁止組織成員變量序列化 transient (public transient int age;) public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Demo1Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Demo1Person [name=" + name + ", age=" + age + "]"; } }
序列化和反序列化Person對象
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; //IO流的對象 實現對IO流的序列化和反序列化 public class Demo1ObjectStream { public static void main(String[] args) throws Exception { //writeObject(); readObject(); } public static void writeObject() throws Exception{ FileOutputStream fos=new FileOutputStream("c:\\person.txt"); //創建寫出對象的序列化流的對象,構造方法傳遞字節輸出流,writeObject()寫對象 ObjectOutputStream oos=new ObjectOutputStream(fos); Demo1Person p=new Demo1Person("光頭強", 5); oos.writeObject(p); oos.close(); } public static void readObject() throws Exception{ FileInputStream fis=new FileInputStream("c:\\person.txt"); //創建反序列化流,readObject()讀對象 ObjectInputStream ois=new ObjectInputStream(fis); Object obj=ois.readObject();//讀對象 System.out.println(obj); ois.close(); } }