IO流的序列化和反序列化


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(); } }
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM