ISerializable 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
實作java的類別會啟用類別的可串行化性。
[Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")]
public interface ISerializable : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/io/Serializable", "", "Java.IO.ISerializableInvoker")>]
type ISerializable = interface
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 衍生
- 屬性
- 實作
備註
實作java.io.Serializable 介面的 類別會啟用 類別的串行化性。
<強>警告:還原串行化不受信任的數據原本就很危險,應該避免。 應該仔細驗證不受信任的數據。 </strong>
未實作此介面的類別將不會有任何其狀態串行化或還原串行化。 可串行化類別的所有子類型本身都是可串行化的。 串行化介面沒有方法或字段,只能用來識別可串行化的語意。
若要允許串行化不可串行化類別的子類型,子類型可能會負責儲存和還原超型別的公用、受保護和(如果可存取)封裝字段的狀態。 只有當其擴充的類別具有可存取的 no-arg 建構函式來初始化類別的狀態時,子類型才會承擔此責任。 如果不是這種情況,則宣告可串行化的類別是錯誤的。 錯誤會在運行時間偵測到。
還原串行化期間,將使用 類別的公用或受保護的 no-arg 建構函式,初始化不可串行化類別的字段。 no-arg 建構函式必須可供可串行化的子類別存取。 可串行化子類別的欄位將會從數據流還原。
周遊圖形時,可能會遇到不支援 Serializable 介面的物件。 在此情況下,將會擲回 NotSerializableException,並識別不可串行化對象的類別。
在串行化和還原串行化程序期間需要特殊處理的類別必須實作具有這些確切簽章的特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
writeObject 方法負責為其特定類別寫入物件的狀態,以便對應的 readObject 方法可以還原它。 您可以呼叫 out.defaultWriteObject 來叫用儲存物件欄位的預設機制。 方法不需要關注屬於其超類別或子類別的狀態。 狀態是使用 writeObject 方法將個別欄位寫入 ObjectOutputStream,或使用 DataOutput 所支援之基本數據類型的方法來儲存狀態。
readObject 方法負責從數據流讀取和還原類別字段。 它可以呼叫 in.defaultReadObject 來叫用默認機制,以還原物件的非靜態和非暫時性字段。 defaultReadObject 方法會使用數據流中的資訊,將儲存在數據流中的物件欄位指派給目前對象中對應的具名字段。 這會處理 類別已演變為新增欄位的情況。 方法不需要關注屬於其超類別或子類別的狀態。 狀態是藉由從 ObjectInputStream 讀取個別欄位的數據,並指派給對象的適當字段來還原。 DataInput 支援讀取基本數據類型。
readObjectNoData 方法負責在串行化數據流未將指定的類別列為要還原串行化之對象的超級類別時,初始化物件的狀態。 如果接收方使用與傳送者不同的還原串行化實例類別版本,而接收者的版本會擴充傳送者版本未延伸的類別,就可能發生此情況。 如果串行化數據流遭到竄改,也可能會發生此情況;因此,readObjectNoData 在初始化還原串行化物件時很有用,儘管有「惡意」或不完整的來源數據流。
將物件寫入數據流時,需要指定要使用的替代物件可串行化類別,應實作具有確切簽章的特殊方法:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
如果方法存在,而且可以從串行化物件類別內定義的方法存取此方法,就會叫用這個 writeReplace 方法。 因此,方法可以具有私人、受保護和套件私人存取。 這個方法的子類別存取遵循java輔助功能規則。
當數據流的實例從數據流讀取時,需要指定取代的類別,應該使用確切的簽章實作這個特殊方法。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
這個 readResolve 方法遵循與 writeReplace 相同的調用規則和輔助功能規則。
串行化運行時間會與每個可串行化的類別產生關聯,其版本號碼稱為 serialVersionUID,在還原串行化期間會用來驗證串行化對象的傳送者和接收者是否已針對與串行化相容的物件載入類別。 如果接收者已針對具有與對應傳送者類別不同的 serialVersionUID 的物件載入類別,則還原串行化將會產生 InvalidClassException
。 可串行化類別可以宣告自己的 serialVersionUID,方法是宣告名為 "serialVersionUID"
的欄位必須是靜態、最終和 類型 long
:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可串行化類別未明確宣告 serialVersionUID,則串行化運行時間會根據類別的各個層面計算該類別的預設 serialVersionUID 值,如 Java(TM) 物件串行化規格中所述。 不過,<強烈建議/em> 宣告所有可串行化類別明確宣告 serialVersionUID 值,因為預設 serialVersionUID 計算對類別詳細數據高度敏感,這些詳細數據可能會因編譯程式實作而有所不同,因此可能會在還原串行化期間造成非預期的 InvalidClassException
。<> 因此,若要保證不同 Java 編譯程式實作之間的一致 serialVersionUID 值,可串行化類別必須宣告明確的 serialVersionUID 值。 此外,強烈建議明確 serialVersionUID 宣告盡可能使用 private
修飾詞,因為這類宣告只適用於立即宣告 class--serialVersionUID 字段,因此無法做為繼承的成員使用。 陣列類別無法宣告明確的 serialVersionUID,因此它們一律會有預設的計算值,但陣列類別會放棄比對 serialVersionUID 值的需求。
如果您以 android N 為目標,則 serialVersionUID 計算的 Android 實作會稍微變更一些類別。為了保留相容性,此變更只會啟用應用程式目標 SDK 版本設定為 24 或更新版本。 強烈建議使用明確的 serialVersionUID 欄位來避免相容性問題。
<h3>實作可串行化的 Judiciously</h3> 請參閱 有效 Java 關於串行化的章節,以完整涵蓋串行化 API。 該書說明如何使用這個介面,而不會損害應用程式的可維護性。
<h3>建議的替代專案</h3><強>JSON</strong> 是簡潔、人懂且有效率的。 Android 同時 android.util.JsonReader streaming API
包含 和 org.json.JSONObject tree API
,以讀取和寫入 JSON。 使用 GSON 之類的系結連結庫,直接讀取和寫入 Java 物件。
已在1.1中新增。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
JniIdentityHashCode |
傳回包裝實例的 值 |
JniManagedPeerState |
受控對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
Disposed() |
處置實例時呼叫。 (繼承來源 IJavaPeerable) |
DisposeUnlessReferenced() |
如果這個實例沒有未完成的參考,則呼叫 |
Finalized() |
實例完成時呼叫。 (繼承來源 IJavaPeerable) |
SetJniIdentityHashCode(Int32) |
設定所 |
SetJniManagedPeerState(JniManagedPeerStates) |
實作java的類別會啟用類別的可串行化性。 (繼承來源 IJavaPeerable) |
SetPeerReference(JniObjectReference) |
設定所 |
UnregisterFromRuntime() |
取消註冊此實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。 (繼承來源 IJavaPeerable) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
實作java的類別會啟用類別的可串行化性。 |
GetJniTypeName(IJavaPeerable) |
實作java的類別會啟用類別的可串行化性。 |