JavaTM 2 Platform
Standard Ed. 6

java.beans
類別 PersistenceDelegate

java.lang.Object
  繼承者 java.beans.PersistenceDelegate
直接已知子類別:
DefaultPersistenceDelegate

public abstract class PersistenceDelegate
extends Object

PersistenceDelegate 類別負責根據類別的公共 API 中的方法表示給定類別的實例狀態。不是根據它完成時的樣子,通過(例如)ObjectOutputStream 使用的 readObjectwriteObject 方法,將持久存儲的責任與類別本身關聯起來,而是讓使用此委託模型的類似 XMLEncoder 的串流可以擁有不依賴於類別本身控制的自己的行為。通常,該類別是放置資訊的最佳地方,它可以很容易地在此委託方案中表示約定,以完成操作。不過有時會出現這樣的情況,單個類別中的一個很小的問題阻止了整個物件圖形的寫入,這可能會使得應用程序開發人員毫無辦法,只有試圖局部隱藏有問題的類別,或使用替代的持久存儲技巧。在這種情況下,委託模型提供了一個相關的清理機制,使應用程序開發人員干涉序列化過程的所有部分,不需要對不是應用程序本身一部分的類別的實作進行修改。

除了使用委託模型,此持久方案不同於傳統序列化方案的地方在於,它需要 writeObject 方法的仿真,而不需要相應的 readObject 方法。根據此公共 API,writeObject 仿真對每個實例編碼,並且不需要定義 readObject 仿真,因為讀取序列化格式的過程由方法調用的語義定義,正如 Java Language Specification 中展示的那樣。打破 writeObjectreadObject 實作之前的依賴關係,這可能會改變版本,因此它是使此技術產生的檔案不受它們所參考類別的私有實作更改影響的關鍵。

持久委託可以控制物件持久性的所有方面,其中包括:

從以下版本開始:
1.4
另請參見:
XMLEncoder

建構子摘要
PersistenceDelegate()
           
 
方法摘要
protected  void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)
          產生一系列對 newInstance 有副作用的語句,使得新實例等於 oldInstance
protected abstract  Expression instantiate(Object oldInstance, Encoder out)
          返回其值為 oldInstance 的表達式。
protected  boolean mutatesTo(Object oldInstance, Object newInstance)
          如果 oldInstance等效 副本可以可以通過應用 newInstance 的一系列語句來創建,則返回 true。
 void writeObject(Object oldInstance, Encoder out)
          writeObject 是持久性的一個入口點,由傳統委託網要中的 Encoder 使用。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

PersistenceDelegate

public PersistenceDelegate()
方法詳細資訊

writeObject

public void writeObject(Object oldInstance,
                        Encoder out)
writeObject 是持久性的一個入口點,由傳統委託網要中的 Encoder 使用。儘管此方法不是最終方法,但在普通環境下不必為其創建子類別。

此實作首先檢查串流是否已經遇到此物件。接著調用 mutatesTo 方法查看是否可以將從串流中返回的候選者轉變成 oldInstance 的精確副本。如果可以,則調用 initialize 方法執行初始化。如果不可以,則從串流中移除該候選者,並調用 instantiate 方法為此物件創建一個新候選者。

參數:
oldInstance - 將由此表達式創建的實例。
out - 將在其中寫入此表達式的串流。

mutatesTo

protected boolean mutatesTo(Object oldInstance,
                            Object newInstance)
如果 oldInstance等效 副本可以可以通過應用 newInstance 的一系列語句來創建,則返回 true。在此方法的規範中,等效是指修改後的實例其公共 API 中相關方法的行為與 oldInstance 沒有區別。[註:在這裡使用短語相關 方法而不是使用所有 方法只是因為,為了保證完全正確,類似 hashCodetoString 這樣的方法阻止大多數類別實際產生其實例的無區別副本]。

如果兩個實例的類別是相同的,則預設行為返回 true

參數:
oldInstance - 要複製的實例。
newInstance - 要修改的實例。
返回:
如果通過對 oldInstance 進行一系列的修改能夠創建 newInstance 的等效副本,則返回 true。

instantiate

protected abstract Expression instantiate(Object oldInstance,
                                          Encoder out)
返回其值為 oldInstance 的表達式。此方法用於描述應該用來創建給定物件的建構子或處理器方法。例如,用於 Field 類別的持久委託的 instantiate 方法可以定義如下:
 Field f = (Field)oldInstance;
 return new Expression(f, f.getDeclaringClass(), "getField", new Object[]{f.getName()});
 
注意,這裡宣告了所返回表達式的值,因此該表達式的值(由 getValue 返回)將等於 oldInstance

參數:
oldInstance - 將由此表達式創建的實例。
out - 將在其中寫入此表達式的串流。
返回:
值為 oldInstance 的表達式。

initialize

protected void initialize(Class<?> type,
                          Object oldInstance,
                          Object newInstance,
                          Encoder out)
產生一系列對 newInstance 有副作用的語句,使得新實例等於 oldInstance。在此方法的規範中,等效是指在該方法返回之後,修改後的實例其公共 API 中所有方法的行為都與 newInstance 沒有區別。

該實作通常通過產生一系列涉及 oldInstance 及其公共可用狀態的 "what happened" 語句來達到此目的。這些語句使用其 writeExpression 方法發送到輸出串流中,在輸入串流讀取期間,在模擬輸入串流狀態的複製環境中返回涉及元素的表達式。每個返回的語句都將使用新環境中所存在物件代替舊環境中的所有實例。特別是這些語句目標的參考,開始它們是 oldInstance 的參考,返回時成為 newInstance 的參考。執行這些語句會以新環境中物件的一系列修改的形式,實作兩個物件狀態的遞增調整。到 initialize 方法返回時,則無法通過使用公共 API 來區別兩個實例。最重要的是,用來使這些物件看起來相同的步驟順序將被輸出串流記錄,當刷新串流時,將形成實際的輸出。

預設實作調用該型別父級類別的 initialize 方法。

參數:
oldInstance - 要複製的實例。
newInstance - 要修改的實例。
out - 保存所有應該寫入的初始化語句的串流。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only