標記介面是一種具有運行時類型檢查的設計模式,可讓您將介面和類別關聯起來。要理解為什麼這可能是必要的,請考慮使用標記來標記 Serializible 類別的範例。假設我們需要將物件的狀態保存在記憶體中,然後也能夠解密我們儲存的內容。然後,你說,我們可以將物件轉換為一組位元。正確的。我們可以使用 FileInputStream 來使用簡單的方式寫入文件,但這僅在物件很少的情況下才方便,但是如果物件很多怎麼辦?有一個很棒的序列化工具可以實現這一點。使用它時的主要規則是被序列化的物件必須包含所有資料並且不引用其他物件。看看你的類別“啊哈,字段沒有被引用,最好放置可序列化標記。” 當你放置它時,就表示你標記的物件可以寫入ObjectOutputStream。ObjectOutputStream 類別有一個 writeObject0() 方法,它包含 instanceof 檢查,檢查物件是否可以寫入,如果整個系列檢查失敗,則拋出 NotSerializedException 例外,如果沒有,則所有內容都會整齊地寫入記憶體。讓我們建立一個 BigObject 類,我們將序列化它的實例。BigObject
package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } }
類別已經被標記為可序列化。它有一個 id 欄位和附帶的 get/set 方法。 package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); 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(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }
GO TO FULL VERSION