JavaRush /Java Blog /Random-TW /介面 - 標記
dupliaka
等級 29
Санкт-Петербург

介面 - 標記

在 Random-TW 群組發布
標記介面是一種具有運行時類型檢查的設計模式,可讓您將介面和類別關聯起來。要理解為什麼這可能是必要的,請考慮使用標記來標記 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"); } }

記錄物體

首先,我們建立一個可序列化類別 BigObject 的對象,然後為它準備一個資料緩衝區 - 我們將在其中放置所有弓 ByteArrayOutputStream。然後我們準備已經提到的ObjectOutputStream並將緩衝區傳遞給它,將物件寫入流並關閉它。

讀取對象

我們準備一個寫入緩衝區readBuffer,傳入inputStream,讀取readObject()。該對象現已恢復。由於“id”字段不是鏈接,我們能夠標記 Serialized 類,該類完全包含其資料。令牌允許我們簡化類別驗證的過程,而不是在類別中添加驗證函數。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION