"คุณจะจำได้ว่าวันนี้เราตรวจสอบการบันทึกวัตถุและอ่านจากไฟล์หรือไม่"
"ใช่ เราเพิ่งบันทึกไปยังเอาต์พุตสตรีม อ่านจากสตรีมอินพุต"
"ทำได้ดีมาก Amigo ดีใจที่ได้ยินว่าคุณสังเกตเห็นรายละเอียดเหล่านี้ คุณจะสามารถกรอกโค้ดให้สมบูรณ์เพื่อบันทึกและอ่านจากไฟล์ได้หรือไม่"
"ทำอะไรให้เสร็จ! ประกาศ FileInputStream และ FileOutputStream แล้วส่งต่อไปยังวิธีการบันทึกและโหลด ไม่มีอะไรต้องสับสนเกี่ยวกับที่นี่ ง่ายมาก"
"ฉันดีใจแทนคุณ ตอนนี้สำหรับหัวข้อใหม่: การทำให้เป็นอนุกรม "
การทำให้เป็นอนุกรมเกือบจะเหมือนกับที่เราเพิ่งทำไป แต่เจ๋งกว่ามากและสร้างไว้ในเครื่อง Java เครื่อง Java สามารถจัดเก็บและโหลดวัตถุได้ มันไม่จำเป็นต้องมีเมธอดการบันทึกและโหลดด้วยซ้ำ อ็อบเจกต์ทั้งหมดถูกจัดเก็บไว้ในเครื่อง Java และสามารถเข้าถึงได้อย่างเต็มที่"
เราเพียงแค่นำวัตถุนั้นไปบันทึกลงในสตรีมและอ่านจากสตรีม:
public static void main(String[] args) throws Exception
{
Cat cat = new Cat();
//Save a cat to file
FileOutputStream fileOutput = new FileOutputStream("cat.dat");
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
outputStream.writeObject(cat);
fileOutput.close();
outputStream.close();
//Load a cat from file
FileInputStream fiStream = new FileInputStream("cat.dat");
ObjectInputStream objectStream = new ObjectInputStream(fiStream);
Object object = objectStream.readObject();
fiStream.close();
objectStream.close();
Cat newCat = (Cat)object;
}
"แค่นั้นแหละ?"
"ถูกต้อง มี กลไกการ ทำซีเรียลไลเซชัน ขนาดใหญ่และซับซ้อนมาก ซึ่งช่วยให้เราบันทึกลงในสตรีมและอ่านจากสตรีมของข้อมูลเกือบทุกชนิด"
"เกือบทุกชนิด ดังนั้นไม่มีข้อมูลประเภทใดเลย"
"ใช่ ความจริงก็คือไม่ใช่ออบเจ็กต์ทั้งหมดที่มีความสามารถในการบันทึกโดยธรรมชาติออบเจ็กต์บางอย่างไม่เก็บข้อมูลทั้งหมดไว้ภายใน แต่จะอ้างอิงออบเจ็กต์และ/หรือแหล่งข้อมูลอื่นแทน ตัวอย่างเช่น คอนโซล (System. ใน) กระแสอินพุต (InputStream) และสิ่งอื่นๆ"
นั่นเป็นเหตุผลที่ผู้สร้างของ Java มาพร้อมกับเครื่องหมายอินเทอร์เฟซ Serializable พิเศษ เรียกว่าเครื่องหมายเนื่องจากไม่มีข้อมูลและเมธอดใดๆ ใช้เพื่อ "แท็ก" หรือ "ทำเครื่องหมาย" ชั้นเรียนเท่านั้น หากเราเชื่อว่าคลาสของเราเก็บข้อมูลทั้งหมด ไว้ภายใน เราสามารถทำเครื่องหมายด้วยImplement Serializable
นี่คือตัวอย่าง «แมว» ที่รองรับการทำให้เป็นอันดับ:
class Cat implements Serializable
{
public String name;
public int age;
public int weight;
}
เมื่อเราพยายามทำให้เป็นอนุกรม (บันทึก) ออบเจกต์ เครื่อง Java จะตรวจสอบว่ารองรับการทำให้เป็นอนุกรมหรือไม่: ใช้อินเตอร์เฟส Serializable หรือไม่ ถ้าเป็นเช่นนั้นก็จะบันทึกวัตถุ ถ้าไม่เช่นนั้นจะเกิดข้อยกเว้นเพื่อระบุว่าการทำให้เป็นอันดับนั้นเป็นไปไม่ได้
ที่นี่คุณต้องเข้าใจว่าวัตถุที่ทำให้เป็นอนุกรมได้จะต้องประกอบด้วยวัตถุที่ทำให้เป็นอนุกรมได้เท่านั้น
"อืม ก็สมเหตุสมผลดี คุณไม่สามารถรักษาทั้งหมดได้หากไม่เก็บส่วนต่างๆ ของมัน"
"อย่างแน่นอน."
"แล้ว ints, Strings และ ArrayLists ล่ะ"
"พวกเขาทั้งหมดสนับสนุนการทำให้เป็นซีเรียลไลเซชัน ผู้สร้าง Java ใส่ใจเป็นพิเศษเพื่อให้แน่ใจว่าสิ่งนี้เกิดขึ้น ไม่น่าจะมีปัญหาใดๆ เกิดขึ้นที่นี่"
นอกจากนี้ ประเภทของวัตถุจะถูกบันทึกเมื่อวัตถุถูกทำให้เป็นอนุกรม ตอนนี้คุณสามารถบันทึกการอ้างอิงไปยังวัตถุ Cat ในตัวแปร Object ทุกอย่างจะทำให้เป็นซีเรียลไลซ์และดีซีเรียลไลซ์ได้
"ลดซีเรียลไลซ์?"
" การดีซีเรียลไลเซชันเป็นกระบวนการของการย้อนกลับซีเรียลไลเซชัน: การอ่านและสร้างออบเจกต์ใหม่จากสตรีม/ไฟล์"
“อ่า หมดคำถามแล้ว”
GO TO FULL VERSION