首頁  >  文章  >  Java  >  Java中序列化與readResolve()方法的使用詳解

Java中序列化與readResolve()方法的使用詳解

黄舟
黄舟原創
2017-08-08 10:11:482550瀏覽

這篇文章主要介紹了java 中序列化與readResolve()方法的實例詳解的相關資料,這裡提供實例幫助大家理解這部分知識,需要的朋友可以參考下

java 中序列化與readResolve()方法的實例詳解

    readResolve方法是什麼?這個方法跟物件的序列化相關(這樣倒是解釋了為什麼 readResolve方法是private修飾的)。 怎麼跟物件的序列化相關了?

       以下我們先簡單回顧下物件的序列化。一般來說,一個類別實現了 Serializable接口,我們就可以把它往內存地寫再從內存裡讀出而"組裝"成一個跟原來一模一樣的對象。不過當序列化遇到單例時,裡邊就有了個問題:從記憶體讀出而組裝的物件破壞了單例的規則。單例是要求一個JVM中只有一個類別物件的,而現在透過反序列,一個新的物件克隆了出來。如下例所示:

  Java程式碼:


public final class MySingleton implements Serializable { 
   private MySingleton() { } 
   private static final MySingleton INSTANCE = new MySingleton(); 
   public static MySingleton getInstance() { return INSTANCE; } 
}

       當將MySingleton物件(透過getInstance方法取得的那個單例物件)序列化後再從記憶體中讀出時,就有一個全新但跟原來一樣的MySingleton物件存在了。那怎麼來維護單例模式呢?這就要用到readResolve方法。 如下圖所示: 


public final class MySingleton implements Serializable{ 
  private MySingleton() { } 
  private static final MySingleton INSTANCE = new MySingleton(); 
  public static MySingleton getInstance() { return INSTANCE; } 
  private Object readResolve() throws ObjectStreamException { 
    // instead of the object we're on, 
    // return the class variable INSTANCE 
   return INSTANCE; 
  } 
}

           如此,當JVM從記憶體中反序列化地"組裝"一個新物件時,就會自動呼叫這個readResolve方法來回傳我們指定好的物件了,單例規則也就得到了保證。

以上是Java中序列化與readResolve()方法的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn