0Pricing
Java Academy · บทเรียน

พื้นฐานการทำซีเรียลไลซ์ของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานการทำซีเรียลไลซ์ของ Java
  2. ฟิลด์ transient และ serialVersionUID
  3. การทำซีเรียลไลซ์แบบกำหนดเอง: writeObject และ readObject
  4. ทางเลือกสมัยใหม่: JSON และ Protocol Buffers
← กลับไปที่ Java Academy