Java อนุกรม
Java ให้กลไกวัตถุอนุกรมซึ่งวัตถุสามารถแสดงเป็นลำดับของไบต์ลำดับไบต์รวมถึงประเภทของข้อมูลของวัตถุข้อมูลเกี่ยวกับวัตถุและชนิดของข้อมูลที่จัดเก็บในวัตถุ .
หลังจากที่ไฟล์จะถูกเขียนไปยังวัตถุที่ต่อเนื่องสามารถอ่านออกจากไฟล์และมันก็เป็น deserialized, ที่อยู่, ประเภทของข้อมูลวัตถุวัตถุข้อมูลและชนิดข้อมูลวัตถุที่สามารถนำมาใช้ในหน่วยความจำ วัตถุใหม่
กระบวนการทั้งหมดเป็นโปรแกรม Java Virtual Machine (JVM) อิสระที่มีบนแพลตฟอร์มเนื่องวัตถุสามารถ deserialize วัตถุบนแพลตฟอร์มที่แตกต่างอย่างสิ้นเชิง
ObjectInputStream และคลาส ObjectOutputStream ข้อมูลระดับสูงลำธารอนุกรมและวิธีการที่พวกเขามีวัตถุต่อต้านลำดับ
ระดับ ObjectOutputStream มีวิธีการเขียนจำนวนมากเพื่อเขียนความหลากหลายของประเภทข้อมูล แต่ข้อยกเว้นวิธีพิเศษ:
public final void writeObject(Object x) throws IOException
วิธีการดังกล่าวเป็นอันดับวัตถุและส่งไปยังกระแสเอาท์พุท ระดับ ObjectInputStream ที่คล้ายกันมีดังต่อไปนี้วิธีการ deserialize วัตถุ:
public final Object readObject() throws IOException, ClassNotFoundException
วิธีนี้ใช้เวลาวัตถุถัดไปจากกระแสและวัตถุที่ถูก deserialized ค่าตอบแทนของมันคือวัตถุดังนั้นคุณจำเป็นต้องแปลงเป็นชนิดข้อมูลที่เหมาะสม
เพื่อแสดงให้เห็นเป็นอันดับ Java เป็นวิธีการทำงานผมจะใช้การกวดวิชาระดับพนักงานดังกล่าวก่อนถ้าเรากำหนดชั้นของพนักงานต่อไปนี้ซึ่งใช้อินเตอร์เฟซ Serializable
public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } }
โปรดทราบว่าเป็นอันดับวัตถุชั้นในเพื่อที่จะประสบความสำเร็จสองเงื่อนไขจะต้องพบ:
ชั้นต้องใช้วัตถุ java.io.Serializable
คุณลักษณะดังกล่าวทั้งหมดจะต้อง serializable หากมีคุณสมบัติที่ไม่ได้เป็น serializable ทรัพย์สินที่ต้องระบุไว้ในเวลาสั้น ๆ
หากคุณต้องการที่จะรู้ว่าไม่ว่าจะเป็นระดับมาตรฐาน Java เป็น serializable ดูเอกสารสำหรับชั้นนี้ ทดสอบว่าเป็นตัวอย่างของชั้นเรียนสามารถต่อเนื่องเป็นเรื่องง่ายมากเพียงแค่ต้องดูชั้นยังไม่ได้ประสบความสำเร็จในอินเตอร์เฟซ java.io.Serializable
วัตถุเนื่อง
ระดับ ObjectOutputStream จะใช้ในการเป็นอันดับวัตถุ SerializeDemo ตัวอย่างต่อไปนี้ instantiates วัตถุพนักงานและวัตถุเป็นต่อเนื่องไปยังแฟ้ม
หลังจากที่โปรแกรมนี้จะถูกดำเนินการจะสร้างไฟล์ชื่อ employee.ser โปรแกรมนี้มีการส่งออกไม่ได้ แต่คุณสามารถอ่านรหัสที่จะเข้าใจบทบาทของโปรแกรม
หมายเหตุ: เมื่อวัตถุอยู่ต่อเนื่องไปยังแฟ้มให้สอดคล้องกับอนุสัญญา Java มาตรฐานคือจะยื่นขยาย .ser
import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; try { FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /tmp/employee.ser"); }catch(IOException i) { i.printStackTrace(); } } }
วัตถุ deserialize
โปรแกรมตัวอย่าง DeserializeDemo deserialization ต่อไปนี้ / tmp / employee.ser เก็บไว้วัตถุพนักงาน
import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } }
รวบรวมและเรียกใช้โปรแกรมดังกล่าวข้างต้นผลมีดังนี้
Deserialized Employee... Name: Reyan Ali Address:Phokka Kuan, Ambehta Peer SSN: 0 Number:101
ที่นี่เราจะต้องทราบจุดต่อไปนี้:
readObject () วิธีการในความพยายามลอง / จับบล็อกที่จะจับข้อยกเว้น ClassNotFoundException สำหรับ JVM สามารถ deserialize วัตถุนั้นจะต้องสามารถที่จะหาชั้นเรียน bytecode JVM หากไม่สามารถหาชั้นในวัตถุกระบวนการ deserialization ที่โยนยกเว้น ClassNotFoundException
โปรดทราบว่าค่าตอบแทน readObject () วิธีการจะถูกแปลงเป็นพนักงานอ้างอิง
เมื่อวัตถุเป็นอันดับมูลค่าของทรัพย์สิน SSN 111 222 333 แต่เป็นเพราะสถานที่เป็นระยะสั้นค่าไม่ได้ส่งไปยังกระแสเอาท์พุท ดังนั้น SSN แอตทริบิวต์วัตถุพนักงาน deserialized คือ 0