Java.io.ObjectInputStream.readUnshared() 方法



描述

java.io.ObjectInputStream.readUnshared() 方法從 ObjectInputStream 讀取一個“未共享”的物件。此方法與 readObject 相同,除了它可以防止隨後對 readObject 和 readUnshared 的呼叫返回透過此呼叫獲得的反序列化例項的其他引用。具體來說 -

  • 如果呼叫 readUnshared 來反序列化一個反向引用(之前已寫入流的物件的流表示),則會丟擲 ObjectStreamException

  • 如果 readUnshared 成功返回,則隨後嘗試反序列化對由 readUnshared 反序列化的流控制代碼的反向引用將導致丟擲 ObjectStreamException。

透過 readUnshared 反序列化物件會使與返回的物件關聯的流控制代碼失效。請注意,這本身並不總是保證由 readUnshared 返回的引用是唯一的;反序列化的物件可以定義一個 readResolve 方法,該方法返回對其他方可見的物件,或者 readUnshared 可以返回一個類物件或列舉常量,這些常量可以在流的其他地方或透過外部方式獲取。如果反序列化的物件定義了一個 readResolve 方法,並且該方法的呼叫返回一個數組,則 readUnshared 返回該陣列的淺複製;這保證了返回的陣列物件是唯一的,並且無法從 ObjectInputStream 上對 readObject 或 readUnshared 的呼叫中第二次獲得,即使底層資料流已被操作。

覆蓋此方法的 ObjectInputStream 子類只能在擁有“enableSubclassImplementation”SerializablePermission 的安全上下文中構造;任何嘗試在沒有此許可權的情況下例項化此類子類的操作都將導致丟擲 SecurityException。

宣告

以下是 java.io.ObjectInputStream.readUnshared() 方法的宣告。

public Object readUnshared()

引數

返回值

此方法返回對反序列化物件的引用。

異常

  • ClassNotFoundException − 如果無法找到要反序列化的物件的類。

  • StreamCorruptedException − 如果流中的控制資訊不一致。

  • ObjectStreamException − 如果要反序列化的物件已出現在流中。

  • OptionalDataException − 如果原始資料是流中的下一個資料。

  • IOException − 如果在反序列化期間發生 I/O 錯誤。

示例

以下示例顯示了 java.io.ObjectInputStream.readUnshared() 方法的使用。

package com.tutorialspoint;

import java.io.*;

public class ObjectInputStreamDemo {
   public static void main(String[] args) {
      String s = "Hello World";
      
      try {
         // create a new file with an ObjectOutputStream
         FileOutputStream out = new FileOutputStream("test.txt");
         ObjectOutputStream oout = new ObjectOutputStream(out);

         // write something in the file
         oout.writeUnshared(s);
         oout.flush();

         // create an ObjectInputStream for the file we created before
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt"));

         // read and print the unshared object
         System.out.println("" + ois.readUnshared());
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

讓我們編譯並執行上述程式,這將產生以下結果 -

Hello World
java_io_objectinputstream.htm
廣告