อินเตอร์เฟสแบบอนุกรมใน Java พร้อมตัวอย่าง

เผยแพร่แล้ว: 2021-11-29

Java เสนอแพ็คเกจมากมาย ซึ่งอินเทอร์เฟซ Serializable เป็นหนึ่งเดียว มีอยู่ในแพ็คเกจ Java java.io และเป็นประเภทของอินเตอร์เฟสตัวทำเครื่องหมาย เมื่อกำหนดเป็นอินเทอร์เฟซตัวทำเครื่องหมาย จะไม่มีเมธอดหรือฟิลด์ใดๆ ในอินเทอร์เฟซ ดังนั้น เมื่อใดก็ตามที่คลาสใดๆ ใช้งานอินเทอร์เฟซ อินเทอร์เฟซก็ไม่จำเป็นต้องติดตั้งเมธอดใดๆ คลาสใช้อินเทอร์เฟซหากคลาสต้องการให้อินสแตนซ์ของพวกเขาได้รับซีเรียลไลซ์หรือดีซีเรียลไลซ์

กลไกของการทำให้เป็นอันดับใช้สำหรับการแปลงสถานะอ็อบเจ็กต์เป็นสตรีมไบต์ กลไกนี้ดำเนินการโดยใช้ ObjectOutputStream กระบวนการดีซีเรียลไลซ์เซชั่นตรงกันข้ามกับกระบวนการซีเรียลไลซ์เซชั่น ในกรณีนี้ ไบต์สตรีมจะถูกแปลงกลับเป็นอ็อบเจ็กต์ของ Java ObjectInputStream ใช้สำหรับดีซีเรียลไลเซชัน

สารบัญ

การทำให้เป็นอนุกรม

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

กลไกในการเขียนสถานะของอ็อบเจ็กต์ลงในสตรีมไบต์นี้เรียกว่าการทำให้เป็นอนุกรม กลไกนี้ใช้เป็นหลักในเทคโนโลยี JMS, EJB, JPA, RMI และ Hibernate

ObjectInputStream และ ObjectOutputStream คือรูปแบบของคลาสระดับสูงที่ขยาย java.io.InputStream และ java.io.OutputStream ประเภทดั้งเดิมและกราฟอ็อบเจ็กต์สามารถเขียนไปยัง OutputStream โดย ObjectOutputStream ในหน่วยไบต์

ลำธาร. สตรีมที่เป็นผลมาจากการแปลงสามารถอ่านได้ผ่าน ObjectInputStream ดังนั้น สำหรับการทำให้เป็นอนุกรม เมธอด writeObject() จะถูกเรียกจาก ObjectOutputStream และสำหรับการดีซีเรียลไลเซชัน เมธอด readObject() จะถูกเรียกจากคลาส ObjectInputStream

วิธีการที่สำคัญที่สุดใน ObjectOutputStream คือ:

บรรทัดของโค้ดด้านบนนี้นำมาจาก https://www.baeldung.com/java-serialization

ในบรรทัดของโค้ดด้านบน ออบเจ็กต์ที่สามารถซีเรียลไลซ์ได้จะถูกแปลงเป็นสตรีมหรือสตรีมไบต์

ในกรณีของ ObjectInputStream วิธีที่สำคัญที่สุดคือ:

บรรทัดของโค้ดด้านบนนี้นำมาจาก https://www.baeldung.com/java-serialization

บรรทัดของโค้ดด้านบนสามารถอ่านลำดับของไบต์และแปลงสตรีมของไบต์นี้เป็นอ็อบเจกต์ของ Java วัตถุเดิมสามารถย้อนกลับได้

ภาพประกอบของกระบวนการทำให้เป็นอันดับสามารถอธิบายได้ด้านล่าง:

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

แหล่งที่มา

ออบเจ็กต์ประเภทบุคคลสามารถบันทึกลงในไฟล์บางไฟล์ในเครื่องได้ จากนั้นจึงอ่านค่ากลับมา สามารถใช้โค้ดที่แสดงด้านล่างเพื่อจุดประสงค์นี้ได้

ObjectOutputStream ใช้สำหรับบันทึกสถานะอ็อบเจ็กต์ลงในไฟล์โดยใช้ FileOutputStream ในตัวอย่างนี้ ไฟล์ชื่อ “yourfile.txt” ถูกสร้างขึ้นในไดเร็กทอรีของโปรเจ็กต์ ผ่านการใช้ FileInputStream ไฟล์ที่สร้างขึ้นจะถูกโหลด จากนั้นสตรีมนี้จะถูกเลือกโดย ObjectInputStream และแปลงเป็นอ็อบเจ็กต์ใหม่ที่มีชื่อ p2 ในที่สุด สถานะของอ็อบเจ็กต์ที่โหลดขึ้นมาก็ถูกทดสอบ และมันจะถูกจับคู่กับสถานะของอ็อบเจ็กต์ดั้งเดิม วัตถุที่โหลดจะต้องส่งไปยังบุคคลทั่วไปอย่างชัดเจน

คำเตือนในการทำให้เป็นอันดับ Java

1. มรดกและองค์ประกอบ

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

2. UID เวอร์ชันซีเรียล

สำหรับทุกคลาสที่ใช้อินเตอร์เฟส Serializable ตัวเลขจะสัมพันธ์กับแต่ละคลาส หมายเลขนี้เชื่อมโยงกับ Java Virtual Machine ส่วนใหญ่จะทำเพื่อตรวจสอบว่าอ็อบเจ็กต์ที่โหลดและบันทึกมีแอตทริบิวต์ที่แน่นอน เฉพาะในกรณีที่แอตทริบิวต์เหมือนกัน วัตถุจะเข้ากันได้เมื่อมีการซีเรียลไลซ์เซชัน IDE จะสร้างตัวเลขเหล่านี้โดยอัตโนมัติและส่วนใหญ่จะอิงตามชื่อของคลาส คุณลักษณะ และตัวแก้ไขการเข้าถึงที่เกี่ยวข้อง ข้อยกเว้น "InvalidClassException" จะถูกส่งออกไปหากตัวเลขอื่นเป็นผลมาจากการเปลี่ยนแปลง

หาก serialVersionUID ไม่ได้ประกาศโดยคลาสที่ทำให้ซีเรียลไลซ์ได้ JVM จะสร้างมันขึ้นมาโดยอัตโนมัติระหว่างรันไทม์ แม้ว่าจะมีการสร้างหมายเลขโดยอัตโนมัติ แต่ขอแนะนำให้คลาสประกาศ serialVersionUID นี่เป็นเพราะว่า serialVersionUID ซึ่งจะถูกสร้างขึ้นโดยอัตโนมัติจะขึ้นอยู่กับคอมไพเลอร์และบางครั้งอาจส่ง InvalidClassExceptions ที่ไม่คาดคิดออกไป

3. การจัดลำดับแบบกำหนดเอง

มีการตั้งค่าวิธีเริ่มต้นใน Java สำหรับการทำให้วัตถุเป็นอนุกรม Java สามารถแทนที่พฤติกรรมเริ่มต้นนี้ได้ มีวิธีสำหรับซีเรียลไลซ์เซชั่นแบบกำหนดเอง มีประโยชน์อย่างยิ่งในกรณีที่วัตถุที่มีแอตทริบิวต์ที่ไม่สามารถซีเรียลไลซ์ได้กำลังพยายามทำให้เป็นอนุกรม การทำให้เป็นอันดับสำหรับอ็อบเจ็กต์ดังกล่าวสามารถทำได้โดยใช้สองวิธีภายในคลาสที่ผู้ใช้ต้องการทำให้เป็นอนุกรม สองวิธีนี้คือ:

สองวิธีข้างต้นสามารถใช้เพื่อทำให้เป็นอนุกรมของแอตทริบิวต์ในรูปแบบใดๆ ที่สามารถจัดลำดับได้ ซึ่งก่อนหน้านี้ไม่สามารถทำให้เป็นอนุกรมได้

ข้อดีของการทำให้เป็นอันดับใน Java

ข้อดีอย่างหนึ่งของการทำให้เป็นอันดับใน Java คือสถานะของอ็อบเจ็กต์สามารถเดินทางบนเครือข่ายได้

อินเตอร์เฟส Java java.io.Serializable

java.io.Serializable เป็นอินเตอร์เฟสตัวทำเครื่องหมาย ซึ่งหมายความว่าไม่มีเมธอดและอ็อบเจ็กต์ภายในอินเทอร์เฟซ หน้าที่หลักของส่วนต่อประสานเครื่องหมายคือการทำเครื่องหมาย

คลาสของ Java เพื่อให้ความสามารถเฉพาะกับวัตถุทั้งหมดของคลาส ตัวอย่างของส่วนต่อประสานตัวทำเครื่องหมายคือ Remote และ Cloneable

อินเทอร์เฟซต้องถูกใช้งานโดยคลาสใด ๆ ที่ใช้อินเทอร์เฟซสำหรับการทำให้เป็นอนุกรมของวัตถุ โดยดีฟอลต์ คลาส เช่น คลาส wrapper และคลาส String ใช้งานอินเตอร์เฟส java.io.Serializable

ตัวอย่าง java serializable แสดงด้านล่าง

ในโค้ดด้านบนนี้ จะสังเกตได้ว่าคลาส Student ใช้อินเตอร์เฟส Serializable ดังนั้นเมื่อคลาสใช้อินเตอร์เฟส Serializable วัตถุภายในคลาสสามารถแปลงเป็นไบต์ของสตรีมได้

  • คลาส ObjectOutputStream

คลาสนี้ใช้สำหรับเขียนประเภทข้อมูลดั้งเดิมและอ็อบเจ็กต์ Java ลงใน OutputStream ออบเจ็กต์ที่รองรับอินเตอร์เฟส java.io.Serializable สามารถใช้สำหรับการเขียนลงในสตรีม

  • คลาส ObjectInputStream

ข้อมูลดั้งเดิมทั้งหมดที่เขียนโดยใช้ ObjectOutputStream จะถูกดีซีเรียลไลซ์โดยใช้ ObjectInputStream

ตัวอย่างของอินเตอร์เฟส Serializable ใน Java แสดงอยู่ด้านล่าง

ในตัวอย่างนี้ คลาส Student จะถูกจัดลำดับ เมธอด writeObject() ของคลาส ObjectOutputStream มีฟังก์ชันทั้งหมดสำหรับการจัดลำดับอ็อบเจ็กต์ สถานะของวัตถุถูกบันทึกในไฟล์ชื่อ f.txt

บทสรุป

บทความนี้กล่าวถึงแนวคิดของการทำให้เป็นอันดับใน Java มันแสดงรายการอินเทอร์เฟซและวิธีการที่สำคัญอื่น ๆ ที่จำเป็นสำหรับการทำให้เป็นอนุกรมอ็อบเจ็กต์ของคลาส กระบวนการซีเรียลไลซ์เซชั่นนั้นสัมพันธ์กับ id หรือหมายเลขกับทุกคลาสที่ทำให้ซีเรียลไลซ์ได้ หมายเลขนี้เรียกว่า SerialVersionUID การใช้งานหลักของ SerialVersionUID คือการตรวจสอบผู้ส่งและผู้รับสำหรับอ็อบเจ็กต์ที่จะซีเรียลไลซ์ เนื่องจากทั้งผู้ส่งและผู้รับควรเหมือนกัน

เป็นคุณลักษณะที่สำคัญของภาษาการเขียนโปรแกรม Java หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะและแนวคิดที่สำคัญดังกล่าวใน Java และฝึกฝนทักษะภาษาการเขียนโปรแกรมของคุณ คุณสามารถตรวจสอบ หลักสูตรวิศวกรรมซอฟต์แวร์ ที่นำเสนอโดย upGrad หากคุณคือมืออาชีพด้านการทำงาน หลักสูตรนี้เหมาะสมที่สุดสำหรับคุณ หากมีข้อสงสัยประการใด สามารถติดต่อทีมช่วยเหลือของเราได้ คุณยังสามารถเรียกดูเว็บไซต์ของเราสำหรับหลักสูตรเฉพาะและรับข้อมูลรายละเอียด

อินเตอร์เฟสซีเรียลไลซ์ได้ใน Java คืออะไร?

อินเทอร์เฟซแบบซีเรียลไลซ์ได้เป็นส่วนต่อประสานเครื่องหมาย ส่วนต่อประสานตัวทำเครื่องหมายให้คำแนะนำแก่รันไทม์ Java ที่คลาสการนำไปใช้อนุญาตให้ตัวเองถูกซีเรียลไลซ์ รันไทม์จะใช้ประโยชน์จากอินเทอร์เฟซนี้เพื่อทำให้วัตถุเป็นอนุกรม อินเตอร์เฟสแบบซีเรียลไลซ์ได้ในจาวาเป็นอินเตอร์เฟสพิเศษที่จะนำไปใช้โดยคลาสข้อมูลในจาวา เมื่อคลาสใช้อินเทอร์เฟซนี้ สามารถคงอยู่ในฐานข้อมูลได้ อินเทอร์เฟซนี้ประกาศในแพ็คเกจ java.io อินเทอร์เฟซแบบซีเรียลไลซ์ได้มีสองวิธีคือ readResolve() และ writeReplace() ซึ่งใช้ในการอ่านและเขียนอ็อบเจ็กต์ในฐานข้อมูล

จะเกิดอะไรขึ้นถ้าเราใช้อินเตอร์เฟส Serializable ใน Java

การใช้อินเตอร์เฟส Serializable ใน Java หมายถึงการมีอ็อบเจ็กต์ที่สามารถซีเรียลไลซ์และยกเลิกการซีเรียลไลซ์ในระบบใดๆ ที่มีอินเตอร์เฟสซีเรียลไลซ์ได้ การใช้งานอินเทอร์เฟซดังกล่าวจะมีผลเมื่อคลาสถูกจัดลำดับจากภายนอกโดยไลบรารีของบุคคลที่สาม (JSON, XML ฯลฯ) หรือโดยโปรโตคอลเครือข่าย เมื่อตัวแปรถูกประกาศเป็น Serializable แต่ละอินสแตนซ์ของตัวแปรจะถูกทำให้เป็นอนุกรมและดีซีเรียลไลซ์หากมันถูกส่งผ่านเป็นพารามิเตอร์ไปยังเมธอดหรือเมื่อถูกส่งคืนจากเมธอด การทำให้เป็นอันดับถูกดำเนินการโดยทางโปรแกรมเพื่อให้สามารถรักษาสถานะของอ็อบเจ็กต์ไว้ได้ในภายหลัง เมื่อจำเป็นต้องทำการดีซีเรียลไลซ์และนำเสนอต่อผู้ใช้ของอ็อบเจ็กต์

เราสามารถถ่ายโอนวัตถุต่อเนื่องผ่านเครือข่ายได้หรือไม่?

ออบเจ็กต์ต่อเนื่องเป็นอ็อบเจ็กต์ที่มีสตรีมไบต์ คอนสตรัคเตอร์หรือเมธอด writeObject() / readObject() ของออบเจ็กต์ใช้เพื่อวางสตรีมของไบต์ลงในอ็อบเจ็กต์ ข้อมูลที่จัดเก็บอาจเป็นข้อความ เสียง วิดีโอ หรือข้อมูลแอปพลิเคชันที่กำหนดเอง ข้อมูลสำหรับวัตถุเหล่านี้อาจถูกเก็บไว้ในไฟล์หรือบนเซิร์ฟเวอร์ระยะไกล ในการถ่ายโอนวัตถุที่ต่อเนื่องกันผ่านเครือข่าย ต้องใช้โปรโตคอล RMI (Remote Method Invocation) RMI เป็นโปรโตคอลที่ดีสำหรับการสร้างแอปพลิเคชันแบบกระจาย ช่วยให้ไคลเอนต์สามารถสื่อสารกับวิธีการบนวัตถุในแอปพลิเคชัน Java ที่ทำงานบนเซิร์ฟเวอร์ โปรโตคอล RMI เป็นกลไก Remote Procedure Call (RPC)