Java.io.ObjectOutputStream.replaceObject() 方法



描述

java.io.ObjectOutputStream.replaceObject(Object obj) 方法允許ObjectOutputStream的可信子類在序列化期間用一個物件替換另一個物件。在呼叫enableReplaceObject之前,替換物件是被停用的。enableReplaceObject方法檢查請求進行替換的流是否可信。寫入序列化流的每個物件的第一次出現都會傳遞給replaceObject。對該物件的後續引用將被replaceObject的原始呼叫返回的物件替換。為確保物件的私有狀態不會意外洩露,只有可信流才能使用replaceObject。

ObjectOutputStream.writeObject方法採用Object型別(而不是Serializable型別)的引數,以允許處理非可序列化物件被可序列化物件替換的情況。

當子類替換物件時,它必須確保在反序列化期間必須進行補充替換,或者替換的物件與將儲存引用的每個欄位相容。型別不是欄位或陣列元素型別的子類的物件將透過引發異常來中止序列化,並且該物件不會被儲存。

此方法僅在第一次遇到每個物件時呼叫一次。所有後續對該物件的引用都將重定向到新物件。此方法應返回要替換的物件或原始物件。

可以返回Null作為要替換的物件,但這可能會在包含對原始物件引用的類中導致NullReferenceException,因為它們可能期望的是一個物件而不是null。

宣告

以下是java.io.ObjectOutputStream.replaceObject()方法的宣告。

protected Object replaceObject(Object obj)

引數

obj − 要替換的物件。

返回值

此方法返回替換指定物件的替代物件。

異常

IOException − 底層OutputStream丟擲的任何異常。

示例

以下示例顯示了java.io.ObjectOutputStream.replaceObject()方法的用法。

package com.tutorialspoint;

import java.io.*;

public class ObjectOutputStreamDemo extends ObjectOutputStream {

   public ObjectOutputStreamDemo(OutputStream out) throws IOException {
      super(out);
   }

   public static void main(String[] args) {
      Object s2 = "Bye World!";
      
      try {
         // create a new file with an ObjectOutputStream
         FileOutputStream out = new FileOutputStream("test.txt");
         ObjectOutputStreamDemo oout = new ObjectOutputStreamDemo(out);

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

         // enable object replacing
         oout.enableReplaceObject(true);

         // replace object
         System.out.println("" + oout.replaceObject(s2));

         // close the stream
         oout.close();

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

         // read and print an int
         System.out.println("" + (String) ois.readObject());
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

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

Bye World!
Hello World!
java_io_objectoutputstream.htm
廣告