ใน Java ทุกอย่างเป็นวัตถุและในสภาพแวดล้อมแบบกระจายมักจะจำเป็นต้องส่งวัตถุจากปลายด้านหนึ่งของเครือข่ายหรืออุปกรณ์ไปอีกด้านหนึ่ง สิ่งนี้ต้องการโปรโตคอลที่สามารถส่งข้อมูลที่ปลายทั้งสอง กลไกการทำให้เป็นอนุกรม Java ถูกสร้างขึ้นเพื่อแก้ปัญหานี้
หลังจากแปลงสถานะวัตถุเป็นสตรีมไบต์คุณสามารถบันทึกลงในไฟล์โดยใช้คลาสของสตรีมไบต์ต่างๆในแพ็คเกจ java.io ให้ท่อลงในเธรดอื่นหรือส่งข้อมูลวัตถุไปยังโฮสต์อื่นผ่านการเชื่อมต่อเครือข่าย ฟังก์ชั่นการทำให้เป็นอนุกรมของวัตถุนั้นง่ายมากและทรงพลังและใช้ใน RMI, ซ็อกเก็ต, JMS และ EJB ปัญหาการทำให้เป็นอนุกรมของวัตถุไม่ใช่ปัญหาหลักที่สุดในการเขียนโปรแกรมเครือข่าย แต่เป็นสิ่งสำคัญมากและมีความสำคัญในทางปฏิบัติมากมาย
การทำให้เป็นอนุกรมวัตถุ Java ไม่เพียง แต่เก็บข้อมูลของวัตถุหนึ่งชิ้นเท่านั้น แต่ยังช่วยประหยัดข้อมูลของวัตถุแต่ละชิ้นที่อ้างอิงโดยวัตถุได้อีกครั้ง ลำดับชั้นของวัตถุทั้งหมดสามารถเขียนลงในสตรีมไบต์บันทึกในไฟล์หรือส่งผ่านการเชื่อมต่อเครือข่าย การทำให้เป็นอนุกรมของวัตถุสามารถใช้เพื่อดำเนินการ "การคัดลอกลึก" ของวัตถุนั่นคือการคัดลอกวัตถุตัวเองและวัตถุอ้างอิงเอง การทำให้เป็นอนุกรมวัตถุอาจส่งผลให้ลำดับของวัตถุทั้งหมด
วิธีการใช้งานขั้นพื้นฐาน:
Serialization หมายถึงการคงอยู่คลาสหรือประเภทข้อมูลพื้นฐานลงในสตรีมข้อมูลรวมถึงไฟล์สตรีมไบต์และสตรีมข้อมูลเครือข่าย
การใช้งานของการทำให้เป็นอนุกรมใน Java ส่วนใหญ่อาศัยสองคลาส: ObjectOutStream และ ObjectInputStream พวกเขาเป็น subclasses ของ outputstream และ inputstream ในระบบ Java IO เนื่องจากพวกเขาเป็นลำธารใน Java IO พวกเขาจึงสามารถใช้งานได้เช่นสตรีม นี่คือวิธีการใช้งาน:
นำเข้า Java.io.ByTearrayInputStream; นำเข้า Java.io.ByTeArrayOutputStream; นำเข้า java.io.ioException; นำเข้า Java.io.ObjectInputStream; นำเข้า Java.io.ObjectOutputStream; นำเข้า java.io.serializable; คู่ระดับสาธารณะใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -1874850715617681161L; ประเภท int ส่วนตัว; ชื่อสตริงส่วนตัว; public int getType () {ประเภทการส่งคืน; } โมฆะสาธารณะ setType (ประเภท int) {this.type = type; } สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } คู่สาธารณะ (ประเภท int, ชื่อสตริง) {super (); this.type = type; this.name = ชื่อ; } โมฆะคงที่สาธารณะหลัก (String [] args) พ่น IOException, classnotFoundException {// วิธีการที่สร้างอัตโนมัติแบบอัตโนมัติ stub // serialize คู่วัตถุ byteArrayOutputStream bos = new ByteArrayOutputStream (); ObjectOutputStream OOS = ใหม่ ObjectOutputStream (BOS); คู่คู่ = คู่ใหม่ (1, "Charlie"); oos.writeObject (คู่); // deserialize object รับ Object ใหม่ newpair byteArrayInputStream bis = ใหม่ byteArrayInputStream (bos.tobyteArray ()); ObjectInputStream OIS = ใหม่ ObjectInputStream (bis); จับคู่ newpair = (pair) ois.readobject (); System.out.println (newpair.getType ()+":"+newpair.getName ()); -1. ทั้งสองชั้นเรียนอยู่ในรูปแบบมัณฑนากร เมื่อสร้างพวกเขาจะต้องผ่านกระแสที่ใช้ไบต์ สตรีมเหล่านี้เป็นสิ่งที่เก็บข้อมูลที่เป็นอนุกรมไว้ด้านล่าง
2. คลาสที่คงอยู่จะต้องใช้อินเตอร์เฟสแบบอนุกรม อินเทอร์เฟซนี้ไม่มีฟังก์ชั่น แต่เป็นเพียงอินเทอร์เฟซการทำเครื่องหมาย หากการทำให้เป็นอนุกรมดำเนินการบนเครื่องหนึ่งและข้อมูลที่ได้จะถูกส่งไปยังเครื่องอื่นเพื่อ deserialization ดังนั้นคลาสของเครื่องทั้งสองนี้ควรจะเหมือนกันอย่างแน่นอนมิฉะนั้นการทำให้เป็นอนุกรมจะไม่สำเร็จ
3. จำไว้ว่าอย่าใช้ ToString เพื่อรับสตริงในรหัสด้านบนจากนั้นรับ ByteArrayInputStream จากสตริงนี้แล้ว deserialize BOS ถูกเก็บไว้ในไบต์ การแปลงเป็นสตริงที่เก็บไว้ในอักขระจะทำให้เกิดการเปลี่ยนแปลงข้อมูลอย่างหลีกเลี่ยงไม่ได้และไบต์ [] ที่ดึงมาจากสตริงจะไม่เป็นไบต์ก่อนหน้า [] ฉันพบปัญหานี้เพราะฉันต้องการจัดเก็บข้อมูลอนุกรมในไฟล์ XML ดูบทความอื่นในการแก้ปัญหาเฉพาะของฉันสำหรับปัญหานี้:
www.vevb.com/article/88130.htm
Java Virtual Machine ทำอะไรได้บ้างเมื่อทำให้เป็นอนุกรมและ deserializing มัน?
กลไกการทำให้เป็นอนุกรม Java ในคำอธิบายของสองคลาสนี้อธิบายไว้ในรายละเอียดใน Javadoc:
อ้าง
กลไกการทำให้เป็นอนุกรมเริ่มต้นสำหรับวัตถุเขียนคลาสของวัตถุลายเซ็นของคลาสและค่าของฟิลด์ที่ไม่เปลี่ยนแปลงและไม่คงที่ทั้งหมด การอ้างอิงถึงวัตถุอื่น ๆ (ยกเว้นในเขตข้อมูลชั่วคราวหรือแบบคงที่) ทำให้วัตถุเหล่านั้นเขียนด้วย การอ้างอิงหลายรายการไปยังวัตถุเดียวถูกเข้ารหัสโดยใช้กลไกการแชร์อ้างอิงเพื่อให้กราฟของวัตถุสามารถกู้คืนได้เป็นรูปร่างเดียวกันกับเมื่อเขียนต้นฉบับ
กลไกการทำให้เป็นอนุกรมเริ่มต้นเขียนข้อมูลไปยังสตรีมรวมถึง:
1. คลาสที่เป็นของวัตถุ
2. ลายเซ็นชั้นเรียน
3. คุณสมบัติที่ไม่เกี่ยวกับการขนส่งและไม่คงที่ทั้งหมด
4. การอ้างอิงไปยังวัตถุอื่น ๆ จะทำให้เกิดการจัดลำดับของวัตถุเหล่านี้
5. หากการอ้างอิงหลายครั้งชี้ไปที่วัตถุจะใช้กลไกการอ้างอิงการแชร์
อ้าง
ชั้นเรียนที่ต้องใช้การจัดการพิเศษในระหว่างการทำให้เป็นอนุกรมและกระบวนการ deserialization ต้องใช้วิธีการพิเศษกับลายเซ็นที่แน่นอนเหล่านี้:
โมฆะส่วนตัว readObject (java.io.ObjectInputStream สตรีม) พ่น IOException, classnotFoundException; โมฆะส่วนตัว writeObject (java.io.ObjectOutputStream สตรีม) พ่น IOException ส่วนตัวโมฆะส่วนตัว readObjectNodata () พ่น ObjectStreamexception;