有兩種類似的方法在Java的ObjectInputStream:什麼時候會使用ObjectInputStream.readUshared()與.readObject()?
和
的文檔狀態:
public Object readUnshared() throws IOException, ClassNotFoundException
從ObjectInputStream中讀取「未共享」對象。此方法與readObject相同,只是它阻止對readObject的後續調用,並且readUnshared不會返回通過此調用獲取的反序列化實例的其他引用。具體來說:
如果調用readUnshared以反序列化後向引用(先前已寫入流的對象的流表示形式),則會拋出ObjectStreamException。
如果readUnshared返回成功,則任何後續嘗試反序列化對由readUnshared反序列化的流句柄的反向引用都將導致拋出ObjectStreamException。
通過讀取反序列化對象未共享使與返回對象關聯的流處理無效。請注意,這本身並不總是保證readUnshared返回的引用是唯一的;反序列化的對象可以定義一個readResolve方法,該方法返回一個可見的對象給另一方,或者readUnshared可以返回一個Class對象或者可以在流中其他地方或者通過外部手段獲得的枚舉常量。如果反序列化的對象定義了一個readResolve方法,並且該方法的調用返回一個數組,則readUnshared會返回該數組的淺表副本;這保證了返回的數組對象是唯一的,即使基礎數據流已被操作,也無法從ObjectObject的readObject或readUnshared調用中獲得第二次。
重寫此方法的ObjectInputStream子類只能在擁有「enableSubclassImplementation」SerializablePermission;任何嘗試實例化沒有此權限的子類都將導致拋出SecurityException。
但我想知道如果任何人有現實生活中使用這種利用.readUnshared()
VS .readObject()
從未使用它。一種用法是作爲協議完整性檢查來確保發送者正在使用'writeUnshared()'。如果他不是所描述的例外情況將會導致。 – EJP 2015-04-03 02:51:41