อินเทอร์เฟซของมาร์กเกอร์คือรูปแบบการออกแบบที่มีการตรวจสอบประเภทรันไทม์ที่ช่วยให้คุณสามารถเชื่อมโยงอินเทอร์เฟซและคลาสได้ เพื่อให้เข้าใจว่าเหตุใดจึงจำเป็น ลองพิจารณาตัวอย่างการทำเครื่องหมายคลาส Serializible ด้วยเครื่องหมาย สมมติว่าเราจำเป็นต้องบันทึกสถานะของออบเจ็กต์ไว้ในหน่วยความจำ จากนั้นจึงสามารถถอดรหัสสิ่งที่เราบันทึกไว้ได้ จากนั้นคุณบอกว่าเราสามารถแปลงวัตถุของเราให้เป็นชุดบิตได้ ขวา. เราสามารถใช้วิธีง่ายๆ ในการเขียนไฟล์โดยใช้ FileInputStream ได้ แต่จะสะดวกก็ต่อเมื่อมีอ็อบเจ็กต์ไม่กี่รายการ แต่จะเกิดอะไรขึ้นหากมีหลายอ็อบเจ็กต์ล่ะ? มีเครื่องมือซีเรียลไลซ์ที่ยอดเยี่ยมสำหรับสิ่งนี้ กฎหลักเมื่อคุณใช้ก็คือออบเจ็กต์ที่กำลังซีเรียลไลซ์จะต้องมีข้อมูลทั้งหมด และไม่อ้างอิงถึงออบเจ็กต์อื่น ดูชั้นเรียนของคุณ “อ๋อ ช่องต่างๆ ไม่ได้รับการอ้างอิง และเป็นการดีที่จะใส่เครื่องหมายซีเรียลไลซ์ได้” และเมื่อคุณใส่เข้าไปก็จะหมายความว่าอ็อบเจ็กต์ที่คุณทำเครื่องหมายสามารถเขียนลงใน ObjectOutputStream ได้ คลาส ObjectOutputStream มีเมธอด writeObject0() และมีอินสแตนซ์ของการตรวจสอบที่ตรวจสอบว่าสามารถเขียนอ็อบเจ็กต์ได้หรือไม่ และหากชุดการตรวจสอบทั้งหมดล้มเหลว ข้อยกเว้น NotSerializableException จะถูกส่งออกไป และหากไม่ ทุกอย่างจะถูกเขียนลงในหน่วยความจำอย่างเรียบร้อย มาสร้างคลาส 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; } }
อันดับ คลาส BigObject ถูกทำเครื่องหมายเป็น Serializable แล้ว โดยมีช่องรหัสเดียวและมีเมธอด 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