ทั้ง Serialization และ Externalization เป็นกระบวนการแปลงอ็อบเจ็กต์เป็น byte stream และจัดเก็บ byte stream ในฐานข้อมูลหรือหน่วยความจำ คลาสที่ implements java.io.Serializable สามารถ serialize ได้ ส่วน Externalization ใช้สำหรับ custom serialization ตามความต้องการของแอปพลิเคชัน Externalization extends java.io.Serializable
ตารางเปรียบเทียบรายละเอียด
| ลำดับ | หัวข้อ | Serialization | Externalization |
|---|---|---|---|
| 1 | อินเทอร์เฟซ | Serializable เป็น marker interface (ไม่มีเมธอด) | Externalizable มีสองเมธอดคือ readExternal และ writeExternal |
| 2 | ตรรกะการนำไปใช้ | คลาสที่ implement interface นี้มอบภาระให้ JVM จัดการ serialize/persist อ็อบเจ็กต์ JVM ใช้ readObject และ writeObject | Externalizable ให้ความควบคุมตรรกะการนำไปใช้แก่แอปพลิเคชันโดยการ override readExternal และ writeExternal |
| 3 | วิธีการละเว้นตัวแปร | JVM ข้าม transient variable ระหว่าง serialization และ deserialization | โปรแกรมเมอร์เขียนตรรกะเองเพื่อละเว้นตัวแปรบางส่วนระหว่าง externalization |
| 4 | ประสิทธิภาพ | Serializable ใช้ reflection ทำให้ประสิทธิภาพช้ากว่า | Externalizable ให้ความควบคุมเต็มที่เหนือวิธีการนำไปใช้ |
| 5 | การ serialize พร้อมการสืบทอด | 1. ถ้า superclass ไม่ serializable subclass ยัง serialize ได้ 2. ถ้า subclass ไม่ serialized แต่ superclass เป็น serializable จะ serialized อัตโนมัติ |
สามารถนำไปใช้กับ externalizable ได้เช่นกัน |
ตัวอย่าง Externalizable
class ExternalizableExample implements Externalizable {
Integer id;
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(id);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = in.readInt();
}
}
ตัวอย่าง Serializable
class SerializableExample implements Serializable {
private static final long serialVersionUID = 5081877L;
String name;
}
สรุป
Serializable ใช้ง่าย เหมาะสำหรับกรณีทั่วไป แต่ประสิทธิภาพต่ำกว่าและควบคุมได้น้อย Externalizable ให้ความควบคุมเต็มที่และประสิทธิภาพดีกว่า แต่ต้องเขียนโค้ดเพิ่มเติม เลือกใช้ตามความต้องการของโปรเจกต์