|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.io.OutputStream java.io.ObjectOutputStream
public class ObjectOutputStream
ObjectOutputStream 將 Java 物件的基本資料型別和圖形寫入 OutputStream。可以使用 ObjectInputStream 讀取(重構)物件。通過在串流中使用檔案可以實作物件的持久存儲。如果串流是網路Socket串流,則可以在另一台主機上或另一個進程中重構物件。
只能將支持 java.io.Serializable 介面的物件寫入串流中。每個 serializable 物件的類別都被編碼,編碼內容包括類別名和類別簽章、物件的欄位值和陣列值,以及從初始物件中參考的其他所有物件的閉套件。
writeObject 方法用於將物件寫入串流中。所有物件(包括 String 和陣列)都可以通過 writeObject 寫入。可將多個物件或基元寫入串流中。必須使用與寫入物件時相同的型別和順序從相應 ObjectInputstream 中讀回物件。
還可以使用 DataOutput 中的適當方法將基本資料型別寫入串流中。還可以使用 writeUTF 方法寫入字元串。
物件的預設序列化機制寫入的內容是:物件的類別,類別簽章,以及非瞬態和非靜態欄位的值。其他物件的參考(瞬態和靜態欄位除外)也會導致寫入那些物件。可使用參考共享機制對單個物件的多個參考進行編碼,這樣即可將物件的圖形恢復為最初寫入它們時的形狀。
例如,要寫入可通過 ObjectInputStream 中的範例讀取的物件,請執行以下操作:
FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeInt(12345); oos.writeObject("Today"); oos.writeObject(new Date()); oos.close();
在序列化和反序列化過程中需要特殊處理的類別必須實作具有下列準確簽章的特殊方法:
private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; private void writeObject(java.io.ObjectOutputStream stream) throws IOException private void readObjectNoData() throws ObjectStreamException;
writeObject 方法負責寫入特定類別的物件狀態,以便相應的 readObject 方法可以恢復它。該方法本身不必與屬於物件的父級類別或子類別的狀態有關。狀態是通過使用 writeObject 方法或使用 DataOutput 支持的用於基本資料型別的方法將各個欄位寫入 ObjectOutputStream 來保存的。
序列化操作不寫出沒有實作 java.io.Serializable 介面的任何物件的欄位。不可序列化的 Object 的子類別可以是可序列化的。在此情況下,不可序列化的類別必須有一個無參數建構子,以便允許初始化其欄位。在此情況下,子類別負責保存和恢復不可序列化的類別的狀態。經常出現的情況是,該類別的欄位是可存取的(public、package 或 protected),或者存在可用來恢復狀態的 get 和 set 方法。
在 writeObject 和 readObject 方法的實作中拋出 NotSerializableException,可以阻止物件的序列化。ObjectOutputStream 將捕獲異常並中止序列化進程。
實作 Externalizable 介面允許物件假定可以完全控制物件的序列化形式的內容和格式。調用 Externalizable 介面的方法(writeExternal 和 readExternal)來保存和恢復物件的狀態。通過類別實作時,它們可以使用 ObjectOutput 和 ObjectInput 的所有方法讀寫它們自己的狀態。物件負責處理出現的任何版本控制。
Enum 常數的序列化不同於普通的 serializable 或 externalizable 物件。enum 常數的序列化形式只包含其名稱;常數的欄位值不被傳送。為了序列化 enum 常數,ObjectOutputStream 需要寫入由常數的名稱方法返回的字元串。與其他 serializable 或 externalizable 物件一樣,enum 常數可以作為序列化串流中後續出現的 back 參考的目標。用於序列化 enum 常數的進程不可定制;在序列化期間,由 enum 型別定義的全部類別特定的 writeObject 和 writeReplace 方法都將被忽略。類似地,任何 serialPersistentFields 或 serialVersionUID 欄位宣告也將被忽略,所有 enum 型別都有一個 0L 的固定的 serialVersionUID。
基本資料(不包括 serializable 欄位和 externalizable 資料)以塊資料記錄的形式寫入 ObjectOutputStream 中。塊資料記錄由頭部和資料組成。塊資料部分包括標記和跟在部分後面的位元組數。連續的基本寫入資料被合併在一個塊資料記錄中。塊資料記錄的分塊因子為 1024 位元組。每個塊資料記錄都將填滿 1024 位元組,或者在終止塊資料網要時被寫入。調用 ObjectOutputStream 方法 writeObject、defaultWriteObject 和 writeFields 最初只是終止所有現有塊資料記錄。
DataOutput
,
ObjectInputStream
,
Serializable
,
Externalizable
,
Serialization Specification, Section 2, Object Output Classes巢狀類別摘要 | |
---|---|
static class |
ObjectOutputStream.PutField
提供對要寫入 ObjectOutput 的持久欄位的程式存取。 |
欄位摘要 |
---|
建構子摘要 | |
---|---|
protected |
ObjectOutputStream()
為完全重新實作 ObjectOutputStream 的子類別提供一種方法,讓它不必分派僅由 ObjectOutputStream 的實作使用的私有資料。 |
|
ObjectOutputStream(OutputStream out)
創建寫入指定 OutputStream 的 ObjectOutputStream。 |
方法摘要 | |
---|---|
protected void |
annotateClass(Class<?> cl)
子類別可以實作此方法,從而允許在串流中存儲類別資料。 |
protected void |
annotateProxyClass(Class<?> cl)
子類別可以實作此方法,從而在串流中存儲定制資料和動態代理類別的描述符。 |
void |
close()
關閉串流。 |
void |
defaultWriteObject()
將當前類別的非靜態和非瞬態欄位寫入此串流。 |
protected void |
drain()
排空 ObjectOutputStream 中的所有已緩衝資料。 |
protected boolean |
enableReplaceObject(boolean enable)
允許串流對串流中的物件進行替換。 |
void |
flush()
刷新該串流的緩衝。 |
ObjectOutputStream.PutField |
putFields()
獲取用於緩衝寫入串流中的持久存儲欄位的物件。 |
protected Object |
replaceObject(Object obj)
在序列化期間,此方法允許 ObjectOutputStream 的受信任子類別使用一個物件替代另一個物件。 |
void |
reset()
重置將丟棄已寫入串流中的所有物件的狀態。 |
void |
useProtocolVersion(int version)
指定要在寫入串流時使用的串流協議版本。 |
void |
write(byte[] buf)
寫入一個 byte 陣列。 |
void |
write(byte[] buf,
int off,
int len)
寫入位元組的子陣列。 |
void |
write(int val)
寫入一個位元組。 |
void |
writeBoolean(boolean val)
寫入一個 boolean 值。 |
void |
writeByte(int val)
寫入一個 8 位位元組。 |
void |
writeBytes(String str)
以位元組序列形式寫入一個 String。 |
void |
writeChar(int val)
寫入一個 16 位的 char 值。 |
void |
writeChars(String str)
以 char 序列形式寫入一個 String。 |
protected void |
writeClassDescriptor(ObjectStreamClass desc)
將指定的類別描述符寫入 ObjectOutputStream。 |
void |
writeDouble(double val)
寫入一個 64 位的 double 值。 |
void |
writeFields()
將已緩衝的欄位寫入串流中。 |
void |
writeFloat(float val)
寫入一個 32 位的 float 值。 |
void |
writeInt(int val)
寫入一個 32 位的 int 值。 |
void |
writeLong(long val)
寫入一個 64 位的 long 值。 |
void |
writeObject(Object obj)
將指定的物件寫入 ObjectOutputStream。 |
protected void |
writeObjectOverride(Object obj)
子類別用於覆寫預設 writeObject 方法的方法。 |
void |
writeShort(int val)
寫入一個 16 位的 short 值。 |
protected void |
writeStreamHeader()
提供 writeStreamHeader 方法,這樣子類別可以將其自身的頭部添加或預加到串流中。 |
void |
writeUnshared(Object obj)
將“未共享”物件寫入 ObjectOutputStream。 |
void |
writeUTF(String str)
以 UTF-8 修改版格式寫入此 String 的基本資料。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
建構子詳細資訊 |
---|
public ObjectOutputStream(OutputStream out) throws IOException
如果安裝了安全管理器,則在通過覆寫 ObjectOutputStream.putFields 或 ObjectOutputStream.writeUnshared 方法的子類別的建構子來直接或間接調用此建構子時,它將對 "enableSubclassImplementation" SerializablePermission 進行檢查。
out
- 要寫入資料的輸出串流
IOException
- 如果在寫入串流部分時發生 I/O 錯誤
SecurityException
- 如果不受信任的子類別非法覆寫安全敏感方法
NullPointerException
- 如果 out
為 null
ObjectOutputStream()
,
putFields()
,
ObjectInputStream.ObjectInputStream(InputStream)
protected ObjectOutputStream() throws IOException, SecurityException
如果已經安裝了安全管理器,則此方法首先利用 SerializablePermission("enableSubclassImplementation")
權限調用安全管理器的 checkPermission
方法,以確保可以啟用子類別化。
SecurityException
- 如果安全管理器存在,且其 checkPermission
方法不允許啟用子類別化。
IOException
SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
方法詳細資訊 |
---|
public void useProtocolVersion(int version) throws IOException
此例程提供了一個鉤子 (hook),允許以與舊版的串流格式向後相容的格式寫入當前版的 Serialization。
我們將盡最大努力避免造成額外的向後不相容性;但有時沒有其他替代方法。
version
- 根據 java.io.ObjectStreamConstants 使用 ProtocolVersion。
IllegalStateException
- 如果在已序列化所有物件後調用。
IllegalArgumentException
- 如果傳入的版本無效。
IOException
- 如果發生 I/O 錯誤ObjectStreamConstants.PROTOCOL_VERSION_1
,
ObjectStreamConstants.PROTOCOL_VERSION_2
public final void writeObject(Object obj) throws IOException
當 OutputStream 中出現問題或者遇到不應序列化的類別時,將拋出異常。所有異常對於 OutputStream 而言都是致命的,使其處於不確定狀態;並由調用者來忽略或恢復串流的狀態。
ObjectOutput
中的 writeObject
obj
- 要寫入的物件
InvalidClassException
- 序列化操作使用的類別出了問題。
NotSerializableException
- 某個要序列化的物件不能實作 java.io.Serializable 介面。
IOException
- 由底層 OutputStream 拋出的任何異常。protected void writeObjectOverride(Object obj) throws IOException
obj
- 要寫入底層串流的物件
IOException
- 如果寫入底層串流時發生 I/O 錯誤ObjectOutputStream()
,
writeObject(Object)
public void writeUnshared(Object obj) throws IOException
覆寫此方法的 ObjectOutputStream 子類別只能在處理 "enableSubclassImplementation" SerializablePermission 的安全上下文中建構;在不具有此權限的情況下,任何實例化這種子類別的嘗試都將導致拋出 SecurityException。
obj
- 要寫入串流的物件
NotSerializableException
- 如果要序列化的圖形中的物件不能實作 Serializable 介面
InvalidClassException
- 如果要序列化的物件的類別存在問題
IOException
- 如果序列化期間發生 I/O 錯誤public void defaultWriteObject() throws IOException
IOException
- 如果在寫入底層 OutputStream
中時發生 I/O 錯誤public ObjectOutputStream.PutField putFields() throws IOException
IOException
- 如果發生 I/O 錯誤public void writeFields() throws IOException
IOException
- 如果在寫入底層串流時發生 I/O 錯誤
NotActiveException
- 未調用類別 writeObject 方法來寫入物件的狀態時調用。public void reset() throws IOException
IOException
- 如果在序列化物件時調用 reset()。protected void annotateClass(Class<?> cl) throws IOException
cl
- 註釋定制資料的類別
IOException
- 底層 OutputStream 拋出任何異常。protected void annotateProxyClass(Class<?> cl) throws IOException
對於串流中的每個唯一的代理類別描述符,此方法只調用一次。在 ObjectOutputStream
中,此方法的預設實作不執行任何操作。
ObjectInputStream
中的相應方法是 resolveProxyClass
。對於覆寫此方法的 ObjectOutputStream
的給定子類別,ObjectInputStream
的相應子類別中的 resolveProxyClass
方法必須讀取由 annotateProxyClass
寫入的所有資料或物件。
cl
- 註釋定制資料的代理類別
IOException
- 底層 OutputStream
拋出的任何異常ObjectInputStream.resolveProxyClass(String[])
protected Object replaceObject(Object obj) throws IOException
ObjectOutputStream.writeObject 方法使用 Object 型別的參數(相對於 Serializable 型別),允許非 serializable 物件由 serializable 物件取代。
在子類別取代物件時,必須確保要麼在反序列化期間進行互補替代,要麼替代對象與存儲參考的每個欄位相容。如果物件的型別不是欄位或陣列元素型別的子類別,則通過引發異常中止序列化並且不存儲物件。
此方法僅在首次遇到每個物件時調用一次。物件的所有後續參考都將被重定向到新物件。此方法應該返回要替代的物件或初始物件。
替代物件時可以返回 null,但是在包含到初始物件的參考的類別中可能導致 NullReferenceException,因為它們可能期望得到物件而不是 null。
obj
- 要取代的物件
IOException
- 底層 OutputStream 拋出的任何異常。protected boolean enableReplaceObject(boolean enable) throws SecurityException
如果 enable
為 true,並且安裝了安全管理器,則此方法首先利用 SerializablePermission("enableSubstitution")
權限調用安全管理器的 checkPermission
方法,以確保允許串流對串流中的物件進行替換。
enable
- 允許取代物件的 boolean 參數
SecurityException
- 如果安全管理器存在,且其 checkPermission
方法不允許串流對串流中的物件進行替換。SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
protected void writeStreamHeader() throws IOException
IOException
- 如果在寫入底層串流時發生 I/O 錯誤protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException
readClassDescriptor
),以便根據其定制的串流表示形式來重構類別描述符。預設情況下,此方法根據 Object Serialization 規範中定義的格式寫入類別描述符。
注意,僅當 ObjectOutputStream 沒有使用舊的序列化串流格式(通過調用 ObjectOutputStream 的 useProtocolVersion
方法設置)時才調用此方法。如果此序列化串流在使用舊的格式(即 PROTOCOL_VERSION_1
),則以不可覆寫或自定義的方式在內部寫入類別描述符。
desc
- 要寫入串流的類別描述符
IOException
- 如果發生 I/O 錯誤。ObjectInputStream.readClassDescriptor()
,
useProtocolVersion(int)
,
ObjectStreamConstants.PROTOCOL_VERSION_1
public void write(int val) throws IOException
DataOutput
中的 write
ObjectOutput
中的 write
OutputStream
中的 write
val
- 要寫入串流中的位元組
IOException
- 如果發生 I/O 錯誤。public void write(byte[] buf) throws IOException
DataOutput
中的 write
ObjectOutput
中的 write
OutputStream
中的 write
buf
- 要寫入的資料
IOException
- 如果發生 I/O 錯誤。OutputStream.write(byte[], int, int)
public void write(byte[] buf, int off, int len) throws IOException
DataOutput
中的 write
ObjectOutput
中的 write
OutputStream
中的 write
buf
- 要寫入的資料off
- 資料中的初始偏移量len
- 寫入的位元組數
IOException
- 如果發生 I/O 錯誤。public void flush() throws IOException
Flushable
中的 flush
ObjectOutput
中的 flush
OutputStream
中的 flush
IOException
- 如果發生 I/O 錯誤。protected void drain() throws IOException
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void close() throws IOException
Closeable
中的 close
ObjectOutput
中的 close
OutputStream
中的 close
IOException
- 如果發生 I/O 錯誤。public void writeBoolean(boolean val) throws IOException
DataOutput
中的 writeBoolean
val
- 要寫入的 boolean 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeByte(int val) throws IOException
DataOutput
中的 writeByte
val
- 要寫入的位元組值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeShort(int val) throws IOException
DataOutput
中的 writeShort
val
- 要寫入的 short 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeChar(int val) throws IOException
DataOutput
中的 writeChar
val
- 要寫入的 char 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeInt(int val) throws IOException
DataOutput
中的 writeInt
val
- 要寫入的整數值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeLong(long val) throws IOException
DataOutput
中的 writeLong
val
- 要寫入的 long 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeFloat(float val) throws IOException
DataOutput
中的 writeFloat
val
- 要寫入的 float 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeDouble(double val) throws IOException
DataOutput
中的 writeDouble
val
- 要寫入的 double 值
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeBytes(String str) throws IOException
DataOutput
中的 writeBytes
str
- 要寫入的位元組的 String
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeChars(String str) throws IOException
DataOutput
中的 writeChars
str
- 要寫入的 char 的 String
IOException
- 如果在將資料寫入底層串流時發生 I/O 錯誤public void writeUTF(String str) throws IOException
DataOutput
中的 writeUTF
str
- 要寫入的 String
IOException
- 如果在將輸入寫入底層串流時發生 I/O 錯誤
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。