พื้นฐานการทำซีเรียลไลซ์ของ Java
ใช้งาน Serializable เขียนออบเจ็กต์ลงสตรีมด้วย ObjectOutputStream และอ่านกลับมา
พื้นฐานการทำซีเรียลไลซ์ของ Java เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การทำให้สถานะเป็นลำดับไบต์ใน Java คืออะไร
การทำให้สถานะเป็นลำดับไบต์จะแปลงสถานะของอ็อบเจ็กต์เป็นสตรีมไบต์ เพื่อให้สามารถบันทึกลงดิสก์ ส่งผ่านเครือข่าย หรือจัดเก็บในฐานข้อมูลได้ ส่วนการคืนสถานะจากลำดับไบต์จะทำกระบวนการย้อนกลับ
อินเทอร์เฟซเครื่องหมายสำหรับการทำให้เป็นลำดับไบต์
หากต้องการทำให้คลาสเป็นลำดับไบต์ ให้ใช้งาน java.io.Serializable อินเทอร์เฟซนี้ไม่มีเมธอด แต่ใช้ส่งสัญญาณให้ JVM ทราบว่าอินสแตนซ์ของคลาสนี้สามารถทำให้เป็นลำดับไบต์ได้
import java.io.Serializable;
public class User implements Serializable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override public String toString() { return name + " / " + age; }
}การเขียนอ็อบเจ็กต์ด้วย ObjectOutputStream
ครอบ FileOutputStream ด้วย ObjectOutputStream แล้วเรียก writeObject() เพื่อทำให้อ็อบเจ็กต์เป็นลำดับไบต์
import java.io.*;
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.ser"))) {
oos.writeObject(new User("Alice", 30));
System.out.println("Serialized successfully");
}การอ่านอ็อบเจ็กต์ด้วย ObjectInputStream
ครอบ FileInputStream ด้วย ObjectInputStream แล้วเรียก readObject() เพื่อคืนอ็อบเจ็กต์จากลำดับไบต์ จากนั้นแปลงผลลัพธ์เป็นชนิดที่คาดไว้
import java.io.*;
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("user.ser"))) {
User u = (User) ois.readObject();
System.out.println("Deserialized: " + u);
}การซีเรียลไลซ์กราฟของอ็อบเจ็กต์
อ็อบเจ็กต์ทั้งหมดที่อ็อบเจ็กต์ซึ่งถูกซีเรียลไลซ์อ้างอิงถึง ต้องใช้งาน Serializable ได้ด้วย มิฉะนั้นจะเกิด NotSerializableException ขณะทำงาน
public class Order implements Serializable {
private User customer; // User must be Serializable
private List<String> items;
public Order(User customer, List<String> items) {
this.customer = customer;
this.items = items;
}
}NotSerializableException
หากฟิลด์ใด ๆ ในกราฟของอ็อบเจ็กต์ไม่สามารถซีเรียลไลซ์ได้และไม่ได้กำกับด้วย transient Java จะโยน NotSerializableException ขณะเขียนข้อมูล
// Thread is NOT Serializable
public class Task implements Serializable {
private Thread worker; // throws NotSerializableException!
// Fix: mark as transient
private transient Thread worker2;
}กราฟของอ็อบเจ็กต์และการอ้างอิงร่วมกัน
Java ติดตามเอกลักษณ์ของอ็อบเจ็กต์ระหว่างการซีเรียลไลซ์ หากมีสองฟิลด์อ้างอิงถึงอ็อบเจ็กต์เดียวกัน จะเขียนข้อมูลเพียงสำเนาเดียว และฟิลด์ทั้งสองจะชี้ไปยังอินสแตนซ์เดียวกันหลังการดีซีเรียลไลซ์
การซีเรียลไลซ์คอลเลกชัน
คอลเลกชันมาตรฐานอย่าง ArrayList, HashMap และ LinkedList ใช้งาน Serializable ได้อยู่แล้ว จึงซีเรียลไลซ์ได้ตราบใดที่องค์ประกอบของคอลเลกชันเหล่านั้นทำเช่นเดียวกัน
List<String> names = new ArrayList<>(List.of("Alice", "Bob"));
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("names.ser"))) {
oos.writeObject(names);
}การสืบทอดและการซีเรียลไลซ์
หากซูเปอร์คลาสใช้งาน Serializable ได้ คลาสย่อยทั้งหมดก็จะซีเรียลไลซ์ได้เช่นกัน หากซูเปอร์คลาสไม่ใช่ Serializable ฟิลด์ของซูเปอร์คลาสจะไม่ถูกบันทึก และซูเปอร์คลาสต้องมีคอนสตรักเตอร์ที่ไม่มีอาร์กิวเมนต์เพื่อให้ดีซีเรียลไลซ์ได้
การตรวจสอบสตรีมไบต์
สตรีมไบต์ที่ถูกซีเรียลไลซ์จะเริ่มต้นด้วยไบต์พิเศษ 0xACED 0x0005 คุณสามารถตรวจสอบได้ด้วยเครื่องมือแก้ไขเลขฐานสิบหก หรือถอดรหัสด้วยเครื่องมือ SerialVer เพื่อทำความเข้าใจรูปแบบข้อมูล
คำเตือนด้านความปลอดภัย
การดีซีเรียลไลซ์ของ Java เป็นช่องทางการโจมตีที่ทราบกันดี ห้ามดีซีเรียลไลซ์ข้อมูลจากแหล่งที่ไม่น่าเชื่อถือโดยไม่ตรวจสอบความถูกต้อง ควรใช้ JSON, Protobuf หรือซองข้อมูลที่มีลายเซ็นสำหรับข้อมูลภายนอก
ตรวจสอบความเข้าใจอย่างรวดเร็ว
เมธอดใดใช้ซีเรียลไลซ์อ็อบเจ็กต์ลงในสตรีม
สรุปทบทวน
การซีเรียลไลซ์ของ Java ใช้ ObjectOutputStream / ObjectInputStream คลาสต้องใช้งาน Serializable ได้ หลีกเลี่ยงการซีเรียลไลซ์ข้อมูลที่ไม่น่าเชื่อถือ — สำหรับโค้ดใหม่ควรเลือกทางเลือกสมัยใหม่
คำถามที่พบบ่อย
บทเรียน “พื้นฐานการทำซีเรียลไลซ์ของ Java” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐานการทำซีเรียลไลซ์ของ Java” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานการทำซีเรียลไลซ์ของ Java”
ใช้งาน Serializable เขียนออบเจ็กต์ลงสตรีมด้วย ObjectOutputStream และอ่านกลับมา คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐานการทำซีเรียลไลซ์ของ Java” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานการทำซีเรียลไลซ์ของ Java
- ฟิลด์ transient และ serialVersionUID
- การทำซีเรียลไลซ์แบบกำหนดเอง: writeObject และ readObject
- ทางเลือกสมัยใหม่: JSON และ Protocol Buffers