ObjectInputStream 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。
[Android.Runtime.Register("java/io/ObjectInputStream", DoNotGenerateAcw=true)]
public class ObjectInputStream : Java.IO.InputStream, IDisposable, Java.IO.IObjectInput
[<Android.Runtime.Register("java/io/ObjectInputStream", DoNotGenerateAcw=true)>]
type ObjectInputStream = class
inherit InputStream
interface IObjectInput
interface IDataInput
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 繼承
- 屬性
- 實作
備註
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。
ObjectOutputStream 與 ObjectInputStream 分別搭配 FileOutputStream 與 FileInputStream 使用時,能為應用程式提供物件圖形的持久儲存。 ObjectInputStream 用於恢復先前序列化的物件。 其他用途包括透過套接字串流在主機間傳遞物件,或在遠端通訊系統中進行封組與解封組參數。
ObjectInputStream 確保從串流建立的所有物件類型與 Java 虛擬機器中存在的類別相符。 類別依照標準機制載入。
只有支援 java.io.Serializable 或 java.io.Externalizable 介面的物件才能從串流讀取。
此方法 readObject 用於從串流中讀取物件。 應該使用 Java 的安全鑄造來取得所需的型別。 在 Java 中,字串與陣列是物件,序列化時會被視為物件。 讀取時必須鑄造成預期的類型。
原始資料型別可透過 DataInput 上的適當方法從串流讀取。
物件的預設反序列化機制會將每個欄位的內容還原到寫入時的值與型別。 宣告為暫態或靜態欄位的欄位會被反序列化過程忽略。 對其他物件的引用會使這些物件在需要時從串流中讀取。 物件的圖形會透過參考分享機制正確還原。 在反序列化時,總會分配新物件,以防止現有物件被覆寫。
讀取一個物件類似於執行一個新物件的構造子。 記憶體被分配給物件並初始化為零(NULL)。 對於非序列化類別會呼叫 No-arg 建構子,然後從串流中還原這些可序列化類別的欄位,從最接近 java.lang.object 的可序列化類別開始,最後是該物件最特定的類別。
例如,從 ObjectOutputStream 範例中寫出的串流讀取: <br>
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
類別透過實作 java.io.Serializable 或 java.io.Externalizable 介面來控制它們的序列化方式。
實作可序列化介面允許物件序列化儲存並還原物件的整個狀態,並允許類別在串流寫入與讀取之間演進。 它會自動遍歷物件間的參考,儲存並還原整個圖表。
在序列化與反序列化過程中需要特殊處理的可序列化類別,應實作以下方法:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
readObject 方法負責讀取並還原該物件的狀態,使用對應的 writeObject 方法寫入串流的資料。 此方法不必關注其超類或子類所屬的狀態。 狀態是透過從 ObjectInputStream 讀取各欄位的資料,並將該物件的適當欄位指派來恢復。 DataInput 支援讀取原始資料型別。
任何嘗試讀取超過對應 writeObject 方法所寫自訂資料邊界的物件資料,都會拋出一個 OptionalDataException,欄位值為 true。 超過分配資料末端的非物件讀取,會反映資料結束,就像表示串流結束一樣:位元組讀取會回傳 -1 位元組讀取或位元組數,原始讀取則會拋出 EOFExceptions。 若無對應的 writeObject 方法,則預設序列化資料結束即表示分配資料結束。
從 readExternal 方法內發出的原始與物件讀取呼叫行為相同——如果串流已位於對應 writeExternal 方法寫入的資料末尾,物件讀取會拋出 OptionalDataExceptions,且 eof 設為 true,逐位元組讀取回傳 -1,原始讀取則會觸發 EOFExceptions。 請注意,這種行為對於使用舊 ObjectStreamConstants.PROTOCOL_VERSION_1 協定寫入的資料串流不成立,因為 writeExternal 方法所寫資料的結尾未被標記,因此無法被偵測到。
readObjectNoData 方法負責在序列化串流未將該類別列為被反序列化物件的超類別時,初始化物件的狀態。 這種情況可能發生在接收方使用與發送方不同版本的反序列實例類別,而接收方版本擴展了未被發送方版本擴充的類別。 這種情況也可能發生在序列化串流被竄改時;因此,readObjectNoData 對於在原始碼串流「敵對」或不完整的情況下,正確初始化反序列化物件非常有用。
序列化不會讀取或指派任何未實作 java.io.Serializable 介面的物件欄位值。 無法序列化的物件子類別也可以序列化。 此時,非序列化類別必須有一個 no-arg 建構子,才能讓欄位被初始化。 此時,子類別負責儲存並還原不可序列化類別的狀態。 通常該類別的欄位是可存取的(公開、套件或受保護),或有 get 和 set 方法可用來還原狀態。
在反序列化物件時發生的任何例外都會被 ObjectInputStream 捕捉並中止讀取程序。
實作可外部化介面允許物件完全控制其序列化形式的內容與格式。 外部化介面的方法 writeExternal 和 readExternal 會被呼叫來儲存並還原物件狀態。 當類別實作時,它們可以使用 ObjectOutput 和 ObjectInput 的所有方法來寫入和讀取自己的狀態。 處理任何版本變更的責任由物件負責。
枚舉常數的反序列化方式與一般可序列化或外部化物件不同。 序列化形式僅包含其名稱;常數的場值不會被傳送。 要反序列化一個列舉常數,ObjectInputStream 會從串流讀取常數名稱;接著,透過呼叫靜態方法 Enum.valueOf(Class, String) ,並以列舉常數的基型態及接收的常數名稱作為參數,來獲得反序列化常數。 與其他可序列化或外部化的物件一樣,列舉常數可作為序列化串流中後續出現的回溯參考的目標。 枚舉常數反序列化的過程無法自訂:任何由列舉型別定義的類別專用 readObject、readObjectNoData 和 readResolve 方法,在反序列化時都會被忽略。 同樣地,任何 serialPersistentFields 或 serialVersionUID 欄位宣告也會被忽略——所有列舉型別的 serialVersionUID 固定為 0L。
新增於JDK1.1。
Java 文件 java.io.ObjectInputStream。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| ObjectInputStream() |
提供一種方式,讓正在完全重實作 ObjectInputStream 的子類別不必分配剛剛用於此實作的私有資料。 |
| ObjectInputStream(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 表示法時使用的建構函式;由運行時間呼叫。 |
| ObjectInputStream(Stream) |
建立一個 ObjectInputStream,讀取指定的 InputStream。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
傳回這個 |
| Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| JniPeerMembers |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
| 名稱 | Description |
|---|---|
| Available() |
回傳可從此輸入串流讀取(或跳過)而不阻塞的位元組數估計值,該數值可能為 0,或在偵測到串流結束時為 0。 (繼承來源 InputStream) |
| Clone() |
建立並傳回這個 對象的複本。 (繼承來源 Object) |
| Close() |
關閉此輸入串流並釋放與該串流相關的系統資源。 (繼承來源 InputStream) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| DefaultReadObject() |
從此串流讀取當前類別的非靜態與非瞬態場。 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| EnableResolveObject(Boolean) |
啟用串流允許從串流讀取的物件被替換。 |
| Equals(Object) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
| GetHashCode() |
傳回此物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
已淘汰.
當垃圾收集決定不再參考物件時,垃圾收集行程在 物件上呼叫。 (繼承來源 Object) |
| Mark(Int32) |
標記此輸入流的當前位置。 (繼承來源 InputStream) |
| MarkSupported() |
測試此輸入串流是否支援 |
| Notify() |
喚醒正在等候此物件監視器的單一線程。 (繼承來源 Object) |
| NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
| Read() |
讀取一個位元組的資料。 |
| Read(Byte[], Int32, Int32) |
從輸入串流讀取最多位 |
| Read(Byte[]) |
從輸入串流讀取一定數量的位元組,並將其儲存到緩衝陣列 |
| ReadAllBytes() |
讀取輸入串流中剩餘的所有位元組。 (繼承來源 InputStream) |
| ReadAsync() |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 InputStream) |
| ReadAsync(Byte[], Int32, Int32) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 InputStream) |
| ReadAsync(Byte[]) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 InputStream) |
| ReadBoolean() |
讀成布林值。 |
| ReadByte() |
讀取一個 8 位元元組。 |
| ReadChar() |
讀取 16 位元字元。 |
| ReadClassDescriptor() |
讀取序列化串流中的類別描述符。 |
| ReadDouble() |
讀取一個 64 位元的雙重檔案。 |
| ReadFields() |
讀取串流中的持久欄位,並以名稱提供。 |
| ReadFloat() |
讀取一個 32 位元浮點數。 |
| ReadFully(Byte[], Int32, Int32) |
讀取位元組,阻塞直到所有位元組都被讀取完畢。 |
| ReadFully(Byte[]) |
讀取位元組,阻塞直到所有位元組都被讀取完畢。 |
| ReadInt() |
讀取 32 位元的 int。 |
| ReadLine() |
已淘汰.
讀取已由 \n、\r、\r\n 或 EOF 終止的行。 |
| ReadLong() |
長度為 64 位元。 |
| ReadNBytes(Byte[], Int32, Int32) |
從輸入串流讀取請求數量的位元組到給定的位元組陣列。 (繼承來源 InputStream) |
| ReadNBytes(Int32) |
從輸入串流讀取最多指定數量的位元組。 (繼承來源 InputStream) |
| ReadObject() |
讀取 ObjectInputStream 中的物件。 |
| ReadObjectOverride() |
此方法由受信任的 ObjectOutputStream 子類別呼叫,這些子類別使用受保護的 no-arg 建構子來建構 ObjectOutputStream。 |
| ReadShort() |
讀到一個 16 位元短路。 |
| ReadStreamHeader() |
readStreamHeader 方法的提供是為了讓子類別能夠讀取並驗證自己的串流標頭。 |
| ReadUnshared() |
讀取 ObjectInputStream 中的「未共享」物件。 |
| ReadUnsignedByte() |
讀取一個未簽名的 8 位元元組。 |
| ReadUnsignedShort() |
讀取一個無符號的 16 位元短路。 |
| ReadUTF() |
讀取修改過的 UTF-8 格式的字串。 |
| RegisterValidation(IObjectInputValidation, Int32) |
在回傳圖之前,先註冊一個待驗證的物件。 |
| Reset() |
將此串流重新定位至該方法最後被呼叫時的位置 |
| ResolveClass(ObjectStreamClass) |
載入指定串流類別描述的本地類別對應物。 |
| ResolveObject(Object) |
此方法允許 ObjectInputStream 的受信任子類別在反序列化過程中替換一個物件。 |
| ResolveProxyClass(String[]) |
回傳一個代理類別,該類別實作代理類別描述符中所命名的介面;子類別可實作此方法,從串流中讀取自訂資料及動態代理類別的描述符,允許它們使用介面與代理類別的替代載入機制。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| Skip(Int64) |
跳過並丟棄 |
| SkipAsync(Int64) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 InputStream) |
| SkipBytes(Int32) |
跳過位元組。 |
| SkipNBytes(Int64) |
會跳過並丟棄這個輸入串流中精確 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
| TransferTo(Stream) |
讀取此輸入串流中的所有位元組,並依讀取順序將位元組寫入給定的輸出串流。 (繼承來源 InputStream) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
讓目前線程等候直到喚醒為止,通常是藉由em <notified/em>或<em>interrupted</em> 來喚醒它。<> (繼承來源 Object) |
| Wait(Int64, Int32) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
| Wait(Int64) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 (繼承來源 JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
| JavaCast<TResult>(IJavaObject) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadAsync(IObjectInput, Byte[], Int32, Int32) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadAsync(IObjectInput, Byte[]) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadAsync(IObjectInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadBooleanAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadByteAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadCharAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadDoubleAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadFloatAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadFullyAsync(IDataInput, Byte[], Int32, Int32) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadFullyAsync(IDataInput, Byte[]) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadIntAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadLineAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadLongAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadObjectAsync(IObjectInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadShortAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadUnsignedByteAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadUnsignedShortAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| ReadUTFAsync(IDataInput) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| SkipAsync(IObjectInput, Int64) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| SkipBytesAsync(IDataInput, Int32) |
ObjectInputStream 將先前使用 ObjectOutputStream 撰寫的原始資料與物件反序列化。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |