標記接口和深拷貝 - 1

“嗨,阿米戈!”

“嗨,比拉博!”

“今天給大家說說標記接口。”

“標記接口是沒有方法的接口。當一個類實現了這樣的接口時,我們說它被它標記了。”

“這些接口的示例包括:Cloneable、Serializable、Remote。”

Serializable接口用於標記支持序列化的類,表示這些類的實例可以自動序列化和反序列化。”

遠程接口用於識別支持遠程執行的對象,即可以從另一個 Java 虛擬機和/或不同計算機調用的方法。”

Cloneable接口用於標記支持克隆的類。”

“哦,關於克隆或複制。”

“有兩種類型的複制:淺層和深層。”

淺複製是創建一個對象的副本,而不復制它引用的任何對象。”

深度複製涉及復制一個對象,包括它引用的對象,以及這些對象引用的對像等。”

“有一種非常好的方法可以可靠地創建深度克隆。”

“即使開發人員忘記將類標記為可克隆,此方法也能正常工作。唯一的要求是對象必須是可序列化的。”

“這是你如何做的:”

1)在內存中創建一個緩衝區(字節數組)。

2)將對象和子對象序列化到緩衝區中。

3)反序列化緩衝區中保存的對象層次結構。

代碼
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

“在第一行,我們創建了objectOriginal,我們將克隆它。該對象及其所有子對象必須支持序列化。”

“在第三行,我們創建了一個ByteArrayOutputStream,它會隨著新數據的添加而動態擴展(就像一個 ArrayList)。”

“在第 4 行中,我們創建了一個用於序列化的ObjectOutputStream 。”

“在第 5 行,我們使用outputStream將objectOriginal序列化為一個字節數組 ,並將其保存到writeBuffer中。”

“在第 8 行,我們將writeBuffer轉換為一個普通的字節數組。稍後我們將從這個數組中‘讀取’我們的新對象。”

“在第 9 行中,我們將緩衝區轉換為ByteArrayInputStream,以便像 InputStream 一樣從中讀取。”

“在第 10 行,我們將readBuffer傳遞給ObjectInputStream構造函數以讀取(反序列化)對象。”

“在第 11 行,我們讀取了我們的對象並將其轉換為 BigObject

“你怎麼認為?”

“很美麗。”

“順便說一句,當代碼以不同顏色突出顯示時,它更容易理解。”