歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中的序列化與反序列化

Java中的序列化與反序列化

日期:2017/3/1 10:08:35   编辑:Linux編程

序列化和反序列化是通過ObjectInputStream和ObjectOutputStream的readObject()和writeObject()實現的,序列化的過程是一個對象流狀態保存的過程,這裡什麼叫對象流,可以理解為一系列的對象,因為本身一個對象的內部的字段都是一個個對象,實際上是通過“級聯”的方式,保存跟此對象所有關聯的對象的狀態,實際上保存了跟此對象有關系的一張“對象網”。

反序列化是還原對象狀態的過程,這種還原的過程可能在同一個應用中,可能在不同的應用中,可能在不同的主機上,還原的過程不是讀出原來對象的字段值然後調用構造函數重新new一個對象,而是“直接地”反序列化為一個Object對象,並沒有調用該類的構造函數,jvm也沒有加載該類到方法區,還原後的對象若在不同的主機,想通過反射獲得更多改對象的描述信息,必須保證JVM能在本地類路徑或者因特網的其他什麼地方找到相關的.class文件。

序列化也可以自己控制,使用Externalizable接口,此接口繼承自Serializable接口,和Serializable不同的是,使用Externalizable接口,在恢復對象的時候是調用的該類的無參構造方法,若無參構造方法不是public的,在恢復對象的時候會拋出異常,下面的代碼節選自Think in java

  1. package externalizable;
  2. import java.io.Externalizable;
  3. import java.io.IOException;
  4. import java.io.ObjectInput;
  5. import java.io.ObjectOutput;
  6. public class Blip1 implements Externalizable {
  7. //public的構造方法,在回復對象的時候被調用。
  8. public Blip1() {
  9. System.out.println("Blip1 Constructor");
  10. }
  11. //在writeObject()方法的時候,會調用此方法
  12. public void writeExternal(ObjectOutput out) throws IOException {
  13. System.out.println("Blip1.writeExternal");
  14. }
  15. //在readObject()方法的時候,會調用此方法
  16. public void readExternal(ObjectInput in) throws IOException,
  17. ClassNotFoundException {
  18. System.out.println("Blip1.readExternal");
  19. }
  20. }

  1. package externalizable;
  2. import java.io.Externalizable;
  3. import java.io.IOException;
  4. import java.io.ObjectInput;
  5. import java.io.ObjectOutput;
  6. public class Blip2 implements Externalizable {
  7. //此構造方法不是public的
  8. Blip2() {
  9. System.out.println("Blip2 Constructor");
  10. }
  11. public void writeExternal(ObjectOutput out) throws IOException {
  12. System.out.println("Blip2.writeExternal");
  13. }
  14. public void readExternal(ObjectInput in) throws IOException,
  15. ClassNotFoundException {
  16. System.out.println("Blip2.readExternal");
  17. }
  18. }

  1. package externalizable;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. public class Blips {
  7. public static void main(String[] args) {
  8. System.out.println("Constructing objects:");
  9. Blip1 b1 = new Blip1();
  10. Blip2 b2 = new Blip2();
  11. try {
  12. ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(
  13. "Blips.out"));
  14. System.out.println("Saving objects:");
  15. o.writeObject(b1);
  16. o.writeObject(b2);
  17. o.close();
  18. // Now get them back:
  19. ObjectInputStream in = new ObjectInputStream(new FileInputStream(
  20. "Blips.out"));
  21. System.out.println("Recovering b1:");
  22. b1 = (Blip1) in.readObject();
  23. // OOPS! Throws an exception:
  24. // !System.out.println("Recovering b2:");
  25. // !b2 = (Blip2) in.readObject();
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

輸入的結果為:

Constructing objects:
Blip1 Constructor
Blip2 Constructor
Saving objects:
Blip1.writeExternal
Blip2.writeExternal
Recovering b1:
Blip1 Constructor
Blip1.readExternal

Copyright © Linux教程網 All Rights Reserved