กระบวนการนี้ยังสามารถนำไปใช้ผ่านเครือข่ายซึ่งสามารถสร้างวัตถุบนเครื่อง Windows ได้ก่อนแล้วจึงส่งไปยังเครื่อง UNIX ผ่านเครือข่ายจากนั้นรวบรวมใหม่อย่างถูกต้อง เหตุใด RMI, ซ็อกเก็ต, JMS และ EJB แต่ละรายการสามารถผ่านวัตถุ Java ได้หรือไม่
กลไกการทำให้เป็นอนุกรมของวัตถุ Java โดยทั่วไปมีการใช้สองครั้ง:
Java Javabeans: ข้อมูลสถานะถั่วมักจะถูกกำหนดค่าในเวลาออกแบบ . อ่านสถานะวัตถุเพื่อสร้างวัตถุขึ้นมาใหม่และกู้คืนสถานะของโปรแกรม
RMI อนุญาตให้วัตถุบนเครื่องรีโมททำงานเช่นบนเครื่องจักรดั้งเดิม
เราสามารถทำให้ชั้นเรียนเป็นอนุกรมโดยการทำให้คลาสใช้อินเตอร์เฟส java.io.serializable อินเทอร์เฟซนี้เป็นอินเทอร์เฟซผู้ผลิต นั่นคือสำหรับคลาสที่จะนำไปใช้อินเตอร์เฟสไม่จำเป็นต้องใช้วิธีการใด ๆ ส่วนใหญ่จะใช้เพื่อแจ้งเครื่องเสมือน Java (JVMs) ว่าวัตถุจำเป็นต้องได้รับการจัดลำดับ
มีบางจุดที่เราต้องชี้แจงเรื่องนี้:
ไม่ใช่ทุกชั้นเรียนที่สามารถเป็นอนุกรมได้
มีคลาสพื้นฐานมากมายใน Java ที่ใช้อินเตอร์เฟส serializable เช่นสตริงเวกเตอร์ ฯลฯ แต่ตัวอย่างเช่น Hashtable ไม่ได้ใช้อินเตอร์เฟส serializable
มีสองคลาสหลักสำหรับการอ่านหรือการเขียนวัตถุไปยังสตรีม: ObjectOutputStream และ ObjectInputStream.ObjectOutputStream ให้วิธีการเขียนที่ใช้ในการเขียนวัตถุไปยังสตรีมเอาท์พุทและ ObjectInputStream ให้วิธีการอ่านหนังสือสำหรับการอ่านวัตถุจากสตรีมอินพุต วัตถุที่ใช้วิธีการเหล่านี้จะต้องได้รับการอนุกรม นั่นคืออินเทอร์เฟซแบบอนุกรมจะต้องถูกนำไปใช้ หากคุณต้องการเขียนวัตถุ Hashtable คุณจะได้รับข้อยกเว้น
กระบวนการของการทำให้เป็นอนุกรมคือการเขียนวัตถุและอ่านวัตถุจากสตรีมไบต์ หลังจากแปลงสถานะวัตถุเป็นสตรีมไบต์คุณสามารถบันทึกลงในไฟล์โดยใช้คลาสไบต์สตรีมต่างๆในแพ็คเกจ java.io ให้ท่อลงในเธรดอื่นหรือส่งข้อมูลวัตถุไปยังโฮสต์อื่นผ่านการเชื่อมต่อเครือข่าย ฟังก์ชั่นการทำให้เป็นอนุกรมของวัตถุนั้นง่ายมากและทรงพลังและใช้ใน RMI, ซ็อกเก็ต, JMS และ EJB ปัญหาการทำให้เป็นอนุกรมของวัตถุไม่ใช่หัวข้อที่น่าตื่นเต้นที่สุดในการเขียนโปรแกรมเครือข่าย แต่มันค่อนข้างสำคัญและมีความสำคัญในทางปฏิบัติมากมาย
การทำให้เป็นอนุกรมวัตถุสามารถใช้วัตถุแบบกระจายได้ แอปพลิเคชั่นหลักเช่น: RMI ใช้การจัดลำดับวัตถุเพื่อเรียกใช้บริการบนโฮสต์ระยะไกลเช่นเดียวกับเมื่อใช้งานวัตถุบนเครื่องท้องถิ่น
การทำให้เป็นอนุกรมวัตถุ Java ไม่เพียง แต่เก็บข้อมูลของวัตถุหนึ่งชิ้นเท่านั้น แต่ยังช่วยประหยัดข้อมูลของวัตถุแต่ละชิ้นที่อ้างอิงโดยวัตถุได้อีกครั้ง ลำดับชั้นของวัตถุทั้งหมดสามารถเขียนลงในสตรีมไบต์บันทึกในไฟล์หรือส่งผ่านการเชื่อมต่อเครือข่าย การทำให้เป็นอนุกรมของวัตถุสามารถใช้เพื่อดำเนินการ "การคัดลอกลึก" ของวัตถุนั่นคือการคัดลอกวัตถุตัวเองและวัตถุอ้างอิงเอง การทำให้เป็นอนุกรมวัตถุอาจส่งผลให้ทั้งลำดับของวัตถุ
การทำให้เป็นอนุกรม Java นั้นค่อนข้างง่ายและมักจะไม่จำเป็นต้องเขียนโค้ดที่กำหนดเองเพื่อบันทึกและกู้คืนสถานะวัตถุ วัตถุคลาสที่ใช้งานอินเตอร์เฟส java.io.serializable สามารถแปลงเป็นหรือกู้คืนได้จากสตรีมไบต์โดยไม่ต้องเพิ่มรหัสใด ๆ ลงในคลาส เฉพาะในกรณีที่หายากเป็นรหัสที่กำหนดเองที่จำเป็นในการบันทึกหรือกู้คืนสถานะวัตถุ หมายเหตุที่นี่: ไม่ใช่ทุกคลาสที่สามารถเป็นอนุกรมและบางคลาสไม่สามารถเป็นอนุกรมได้
กลไกการทำให้เป็นอนุกรม:
การทำให้เป็นอนุกรมแบ่งออกเป็นสองส่วน: การทำให้เป็นอนุกรมและการ deserialization Serialization เป็นส่วนแรกของกระบวนการนี้การแบ่งข้อมูลเป็นสตรีมของไบต์สำหรับการจัดเก็บในไฟล์หรือการส่งผ่านเครือข่าย Deserialization คือการเปิดกระแสไบต์และสร้างวัตถุขึ้นใหม่ การทำให้เป็นอนุกรมของวัตถุไม่เพียง แต่ต้องแปลงชนิดข้อมูลพื้นฐานเป็นการแสดงไบต์ แต่บางครั้งก็กู้คืนข้อมูลด้วย การกู้คืนข้อมูลต้องใช้อินสแตนซ์ของวัตถุที่กู้คืนข้อมูล กระบวนการทำให้เป็นอนุกรมใน ObjectOutputStream เชื่อมต่อกับสตรีมไบต์รวมถึงประเภทวัตถุและข้อมูลเวอร์ชัน ในระหว่างการ deserialization JVM จะสร้างอินสแตนซ์วัตถุด้วยข้อมูลส่วนหัวจากนั้นคัดลอกข้อมูลจากสตรีมไบต์วัตถุไปยังสมาชิกข้อมูลวัตถุ มาอธิบายกันในสองส่วน:
การประมวลผลการไหลของวัตถุ: ( กระบวนการทำให้เป็นอนุกรมและกระบวนการ deserialization)
แพ็คเกจ java.io มีสองคลาสที่ทำให้เป็นอนุกรมวัตถุ ObjectOutputStream รับผิดชอบในการเขียนวัตถุไปยังสตรีมไบต์และ ObjectInputStream สร้างวัตถุขึ้นมาใหม่จากสตรีมไบต์
ก่อนอื่นให้เข้าใจคลาส ObjectOutputStream คลาส ObjectOutputStream ขยายอินเตอร์เฟส dataOutput
วิธีการ writeObject () เป็นวิธีที่สำคัญที่สุดสำหรับการทำให้เป็นอนุกรมวัตถุ หากวัตถุมีการอ้างอิงไปยังวัตถุอื่น ๆ วิธีการเขียน ()) ทำให้เป็นอนุกรมของวัตถุเหล่านี้ซ้ำ แต่ละ ObjectOutputStream รักษาตารางอ้างอิงวัตถุที่เป็นอนุกรมเพื่อป้องกันหลายสำเนาของวัตถุเดียวกันจากการถูกส่ง (นี่เป็นสิ่งสำคัญ) เนื่องจาก writeObject () สามารถทำให้เป็นอนุกรมชุดวัตถุที่อ้างอิงข้ามทั้งหมดอินสแตนซ์ ObjectOutputStream เดียวกันอาจถูกร้องขอโดยไม่ตั้งใจเพื่อทำให้เป็นอนุกรมวัตถุเดียวกัน ในเวลานี้การทำให้เป็นอนุกรม antireference จะดำเนินการแทนการเขียนลงในกระแสไบต์วัตถุอีกครั้ง
ถัดไปเรามาทำความเข้าใจกับคลาส ObjectOutputStream จากตัวอย่าง
การคัดลอกรหัสมีดังนี้:
// serialize วันที่วันนี้เป็นไฟล์
fileOutputStream f = ใหม่ fileOutputStream ("tmp");
ObjectOutputStream S = New ObjectOutputStream (F);
S.WriteObject ("วันนี้");
S.WriteObject (วันที่ใหม่ ());
s.flush ();
ตอนนี้เรามาทำความเข้าใจกับคลาส ObjectInputStream มันคล้ายกับ ObjectOutputStream มันขยายอินเทอร์เฟซ datainput วิธีการใน ObjectInputStream สะท้อนวิธีการสาธารณะในการอ่านชนิดข้อมูลพื้นฐาน Java ใน DatainputStream เมธอด readobject () deserializes วัตถุจากสตรีมไบต์ ทุกครั้งที่มีการเรียกวิธีการ readobject () วัตถุถัดไปในสตรีมจะถูกส่งกลับ สตรีมวัตถุไบต์ไม่ได้ส่ง bytecode ของคลาส แต่รวมถึงชื่อคลาสและลายเซ็นของมัน เมื่อ readObject () ได้รับวัตถุ JVM จะโหลดคลาสที่ระบุในส่วนหัว หากไม่พบคลาสนี้ readObject () จะโยน classnotfoundexception ส่วนที่เหลือของวิธีการ ObjectInputStream ใช้ในการปรับแต่งกระบวนการ deserialization
ตัวอย่างมีดังนี้:
การคัดลอกรหัสมีดังนี้:
// deserialize วัตถุสตริงและวัตถุวันที่จากไฟล์
FileInputStream ใน = ใหม่ FileInputStream ("TMP");
ObjectInputStream S = New ObjectInputStream (IN);
สตริงวันนี้ = (สตริง) S.ReadObject ();
วันที่ = (วันที่) S.ReadObject ();
กระบวนการทำให้เป็นอนุกรมที่กำหนดเอง:
การทำให้เป็นอนุกรมสามารถทำได้โดยอัตโนมัติ แต่บางครั้งกระบวนการอาจถูกควบคุม Java สามารถประกาศคลาสว่าเป็นอนุกรม แต่ยังสามารถควบคุมสมาชิกข้อมูลด้วยตนเองที่ประกาศว่าเป็นแบบคงที่หรือชั่วคราว
ตัวอย่าง: คลาสการทำให้เป็นอนุกรมที่ง่ายมาก
การคัดลอกรหัสมีดังนี้:
คลาสสาธารณะ simpleserializableclass ใช้ serializable {
String stoday = "วันนี้:";
วันที่ชั่วคราว dttoday = วันที่ใหม่ ();
-
เมื่อทำให้เป็นอนุกรมสมาชิกข้อมูลทั้งหมดของชั้นเรียนควรเป็นแบบอนุกรมยกเว้นที่ประกาศว่าเป็นชั่วคราวหรือคงที่ การประกาศตัวแปรเป็นชั่วคราวบอก JVM ว่าเราจะรับผิดชอบในการทำให้เป็นอนุกรมอาร์กิวเมนต์ หลังจากประกาศสมาชิกข้อมูลเป็นชั่วคราวกระบวนการทำให้เป็นอนุกรมไม่สามารถเพิ่มลงในสตรีมไบต์ของวัตถุและไม่มีข้อมูลที่ส่งจากสมาชิกข้อมูลชั่วคราว เมื่อ deserializing ข้อมูลหลังจากนั้นสมาชิกข้อมูลจะต้องถูกสร้างขึ้นใหม่ (เนื่องจากเป็นส่วนหนึ่งของคำจำกัดความของคลาส) แต่ไม่มีข้อมูลใด ๆ เนื่องจากสมาชิกข้อมูลนี้ไม่ได้เขียนข้อมูลใด ๆ ไปยังสตรีม โปรดจำไว้ว่าสตรีมวัตถุไม่ได้เป็นอนุกรมหรือชั่วคราว ชั้นเรียนของเราต้องใช้วิธีการเขียน () และ readObject () เพื่อประมวลผลสมาชิกข้อมูลเหล่านี้ เมื่อใช้วิธีการ writeObject () และ readObject () คุณควรให้ความสนใจกับการอ่านสมาชิกข้อมูลเหล่านี้ตามลำดับที่พวกเขาเขียน
รหัสบางส่วนเกี่ยวกับวิธีการใช้การทำให้เป็นอนุกรมที่กำหนดเองมีดังนี้
การคัดลอกรหัสมีดังนี้:
// การเขียนวิธีการเขียน () ใหม่เพื่อจัดการสมาชิกชั่วคราว
โมฆะสาธารณะ writeObject (ObjectOutputStream outputStream) พ่น IOException {
outputStream.defaultWriteObject (); // ทำเมธอด writeObject () ที่กำหนดเอง
// ใช้ตรรกะในตัวในการทำให้เป็นอนุกรมอัตโนมัติ
outputStream.writeObject (Osocket.getInetAddress ());
outputStream.writeInt (Osocket.getport ());
-
// เขียนวิธี readObject () เพื่อรับสมาชิกชั่วคราว
โมฆะส่วนตัว readObject (ObjectInputStream InputStream) พ่น IOException
ClassnotFoundException {
InputStream.defaultreadObject (); // defaultreadObject () อาหารเสริมการทำให้เป็นอนุกรมอัตโนมัติ
inetAddress oaddress = (inetAddress) inputStream.readObject ();
int iport = inputStream.readint ();
Osocket = ซ็อกเก็ตใหม่ (oaddress, iport);
iid = getId ();
dttoday = วันที่ใหม่ ();
-
ปรับแต่งกระบวนการทำให้เป็นอนุกรมอย่างสมบูรณ์:
หากคลาสมีความรับผิดชอบอย่างสมบูรณ์ต่อการทำให้เป็นอนุกรมของตัวเองมันจะใช้อินเทอร์เฟซภายนอกแทนอินเตอร์เฟส serializable คำจำกัดความอินเตอร์เฟสภายนอกรวมถึงสองวิธี writeexternal () และ readexternal () วิธีการเหล่านี้สามารถใช้ในการควบคุมวิธีการเขียนข้อมูลสมาชิกของวัตถุไปยังไบต์สตรีม ไม่มีการทำให้เป็นอนุกรมอัตโนมัติเลย ให้ความสนใจที่นี่ คลาสประกาศใช้อินเทอร์เฟซภายนอกที่มีความเสี่ยงด้านความปลอดภัยอย่างมีนัยสำคัญ วิธีการ writeexternal () และ readexternal () ได้รับการประกาศให้เป็นสาธารณะและคลาสที่เป็นอันตรายสามารถใช้วิธีการเหล่านี้ในการอ่านและเขียนข้อมูลวัตถุ หากวัตถุมีข้อมูลที่ละเอียดอ่อนให้ระมัดระวังเป็นพิเศษ ซึ่งรวมถึงการใช้ซ็อกเก็ตที่ปลอดภัยหรือเข้ารหัสสตรีมไบต์ทั้งหมด ณ จุดนี้เราได้เรียนรู้ความรู้พื้นฐานเกี่ยวกับการทำให้เป็นอนุกรม