ส่วนต่อประสานเครื่องหมายและสำเนาลึก - 1

“สวัสดี อามีโก้!”

"สวัสดี บิลาโบ!"

"วันนี้ฉันจะบอกคุณเกี่ยวกับส่วนต่อประสานเครื่องหมาย "

"อินเตอร์เฟสตัวทำเครื่องหมายเป็นอินเทอร์เฟซที่ไม่มีเมธอด เมื่อคลาสใช้อินเทอร์เฟซดังกล่าว เราจะบอกว่ามันถูกทำเครื่องหมายด้วย"

"ตัวอย่างของอินเทอร์เฟซเหล่านี้ได้แก่: โคลนได้ อนุกรมได้ ระยะไกล "

" อินเทอร์เฟซ Serializableใช้เพื่อทำเครื่องหมายคลาสที่สนับสนุนการทำให้เป็นซีเรียลไลซ์ ซึ่งบ่งชี้ว่าอินสแตนซ์ของคลาสเหล่านี้สามารถถูกทำให้เป็นซีเรียลไลซ์และดีซีเรียลไลซ์ได้โดยอัตโนมัติ"

" อินเทอร์เฟซ ระยะไกลใช้เพื่อระบุวัตถุที่สนับสนุนการดำเนินการระยะไกล เช่น วิธีการที่สามารถเรียกใช้จากเครื่องเสมือน Java เครื่องอื่นและ/หรือคอมพิวเตอร์เครื่องอื่น"

" อินเทอร์เฟซ Cloneableใช้เพื่อทำเครื่องหมายคลาสที่รองรับการโคลน"

"โอ้เกี่ยวกับการโคลนหรือการคัดลอก"

"การคัดลอกมีสองประเภท: แบบตื้นและแบบลึก"

" Shallow copyคือการสร้างสำเนาของวัตถุ โดยไม่สร้างสำเนาของวัตถุใดๆ ที่อ้างถึง"

" การทำสำเนาเชิงลึกเกี่ยวข้องกับการทำสำเนาวัตถุ รวมถึงวัตถุที่อ้างถึง และวัตถุที่วัตถุเหล่านั้นอ้างอิง เป็นต้น"

"มีวิธีที่ดีในการสร้างโคลนลึกที่เชื่อถือได้"

"วิธีนี้ใช้ได้ผลแม้ว่านักพัฒนาจะลืมทำเครื่องหมายคลาสว่า 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 เราทำการซีเรียลไลซ์objectOriginalเป็นอาร์เรย์ไบต์โดยใช้outputStream และบันทึกลงในwriteBuffer "

"ในบรรทัดที่ 8 เราแปลงwriteBufferเป็นอาร์เรย์ไบต์ธรรมดา หลังจากนั้น เราจะ 'อ่าน' วัตถุใหม่ของเราจากอาร์เรย์นี้"

"ในบรรทัดที่ 9 เราแปลงบัฟเฟอร์เป็นByteArrayInputStreamเพื่อที่จะอ่านจากมันเหมือน InputStream"

"ในบรรทัดที่ 10 เราส่งreadBufferไปยัง ตัวสร้าง ObjectInputStreamเพื่ออ่าน (ดีซีเรียลไลซ์) วัตถุ"

"ในบรรทัดที่ 11 เราอ่านวัตถุของเราและแปลงเป็นBigObject "

"คุณคิดอย่างไร?"

"มันสวย."

"และอย่างไรก็ตาม เมื่อโค้ดถูกไฮไลท์ด้วยสีต่างๆ ก็จะเข้าใจได้ง่ายขึ้นมาก"