|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.beans.PersistenceDelegate
public abstract class PersistenceDelegate
PersistenceDelegate 類別負責根據類別的公共 API 中的方法表示給定類別的實例狀態。不是根據它完成時的樣子,通過(例如)ObjectOutputStream
使用的 readObject
和 writeObject
方法,將持久存儲的責任與類別本身關聯起來,而是讓使用此委託模型的類似 XMLEncoder
的串流可以擁有不依賴於類別本身控制的自己的行為。通常,該類別是放置資訊的最佳地方,它可以很容易地在此委託方案中表示約定,以完成操作。不過有時會出現這樣的情況,單個類別中的一個很小的問題阻止了整個物件圖形的寫入,這可能會使得應用程序開發人員毫無辦法,只有試圖局部隱藏有問題的類別,或使用替代的持久存儲技巧。在這種情況下,委託模型提供了一個相關的清理機制,使應用程序開發人員干涉序列化過程的所有部分,不需要對不是應用程序本身一部分的類別的實作進行修改。
除了使用委託模型,此持久方案不同於傳統序列化方案的地方在於,它需要 writeObject
方法的仿真,而不需要相應的 readObject
方法。根據此公共 API,writeObject
仿真對每個實例編碼,並且不需要定義 readObject
仿真,因為讀取序列化格式的過程由方法調用的語義定義,正如 Java Language Specification 中展示的那樣。打破 writeObject
與 readObject
實作之前的依賴關係,這可能會改變版本,因此它是使此技術產生的檔案不受它們所參考類別的私有實作更改影響的關鍵。
持久委託可以控制物件持久性的所有方面,其中包括:
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 |
建構子詳細資訊 |
---|
public PersistenceDelegate()
方法詳細資訊 |
---|
public void writeObject(Object oldInstance, Encoder out)
writeObject
是持久性的一個入口點,由傳統委託網要中的 Encoder
使用。儘管此方法不是最終方法,但在普通環境下不必為其創建子類別。
此實作首先檢查串流是否已經遇到此物件。接著調用 mutatesTo
方法查看是否可以將從串流中返回的候選者轉變成 oldInstance
的精確副本。如果可以,則調用 initialize
方法執行初始化。如果不可以,則從串流中移除該候選者,並調用 instantiate
方法為此物件創建一個新候選者。
oldInstance
- 將由此表達式創建的實例。out
- 將在其中寫入此表達式的串流。protected boolean mutatesTo(Object oldInstance, Object newInstance)
oldInstance
的等效 副本可以可以通過應用 newInstance
的一系列語句來創建,則返回 true。在此方法的規範中,等效是指修改後的實例其公共 API 中相關方法的行為與 oldInstance
沒有區別。[註:在這裡使用短語相關 方法而不是使用所有 方法只是因為,為了保證完全正確,類似 hashCode
和 toString
這樣的方法阻止大多數類別實際產生其實例的無區別副本]。
如果兩個實例的類別是相同的,則預設行為返回 true
。
oldInstance
- 要複製的實例。newInstance
- 要修改的實例。
oldInstance
進行一系列的修改能夠創建 newInstance
的等效副本,則返回 true。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
的表達式。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。