Serialisasi Kustom: writeObject dan readObject
Timpa writeObject dan readObject untuk enkripsi, kompresi, atau penanganan field kustom.
Serialisasi Kustom: writeObject dan readObject adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Saat Serialisasi Bawaan Tidak Cukup
Serialisasi bawaan menyimpan semua bidang yang tidak bersifat transient apa adanya. Terkadang Anda memerlukan enkripsi, kompresi, atau representasi yang berbeda. Di sinilah pengait writeObject / readObject digunakan.
Mendeklarasikan writeObject
Tambahkan metode private void writeObject(ObjectOutputStream oos). Java akan memanggilnya sebagai pengganti mekanisme bawaan. Anda dapat mengendalikan dengan tepat apa yang ditulis.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // write non-transient fields normally
oos.writeUTF(encrypt(this.secret)); // write encrypted secret
}Mendeklarasikan readObject
Tambahkan metode private void readObject(ObjectInputStream ois). Java akan memanggilnya selama deserialisasi. Anda harus membaca data dalam urutan yang persis sama dengan saat data ditulis.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // restore non-transient fields
this.secret = decrypt(ois.readUTF()); // decrypt and restore
}Urutan Itu Penting
Apa pun yang Anda tulis dalam writeObject harus dibaca kembali dalam urutan yang sama dalam readObject. Urutan yang tidak cocok menyebabkan StreamCorruptedException.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.writeInt(version);
oos.writeUTF(data);
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
this.version = ois.readInt(); // same order
this.data = ois.readUTF();
}Mengompresi Data Selama Serialisasi
Bungkus aliran dengan GZIPOutputStream di dalam writeObject untuk mengompresi bidang berukuran besar, lalu gunakan GZIPInputStream di dalam readObject untuk mendekompresinya.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (GZIPOutputStream gz = new GZIPOutputStream(bos)) {
gz.write(largePayload.getBytes());
}
oos.writeObject(bos.toByteArray());
}Pengait readResolve
readResolve() dipanggil setelah deserialisasi. Kembalikan objek pengganti — cara ini berguna untuk instans tunggal dan enumerasi agar hanya ada satu instans setelah deserialisasi.
public class AppConfig implements Serializable {
private static final AppConfig INSTANCE = new AppConfig();
private AppConfig() {}
public static AppConfig getInstance() { return INSTANCE; }
private Object readResolve() { return INSTANCE; } // return singleton
}Pengait writeReplace
writeReplace() dipanggil sebelum serialisasi. Kembalikan objek lain untuk diserialisasi sebagai pengganti — cara ini berguna untuk pola proksi dan pengganti dalam serialisasi.
private Object writeReplace() {
return new UserProxy(this.id); // serialize a lightweight proxy
}Memvalidasi Bidang dalam readObject
Anda dapat menambahkan logika validasi di dalam readObject untuk menolak data yang tidak valid atau telah diubah secara tidak sah sebagai bagian dari strategi pertahanan berlapis.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
if (age < 0 || age > 150) {
throw new InvalidObjectException("Invalid age: " + age);
}
}Menangani Perubahan Versi
Gunakan bidang versi dalam writeObject agar readObject dapat menangani format lama dan baru dengan baik selama migrasi.
private static final int SERIAL_VERSION = 2;
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeInt(SERIAL_VERSION);
if (SERIAL_VERSION >= 2) oos.writeUTF(email); // new field
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
int v = ois.readInt();
if (v >= 2) this.email = ois.readUTF();
}Pola Proksi Serialisasi
Pendekatan yang kuat: tulis kelas dalam statis privat yang menangkap keadaan minimum, lalu gunakan writeReplace untuk menulis proksi dan readResolve-nya untuk membangun kembali objek asli.
Pertimbangan Kinerja
Serialisasi khusus menambah overhead pemanggilan metode, tetapi dapat mengurangi ukuran muatan secara signifikan. Lakukan pengukuran sebelum mengoptimalkan; gunakan Externalizable untuk kendali maksimum.
Pemeriksaan Singkat
Apa yang harus benar tentang urutan dalam writeObject dan readObject?
Ringkasan
Timpa writeObject / readObject untuk enkripsi, kompresi, atau format khusus. Gunakan readResolve untuk instans tunggal. Selalu membaca dalam urutan yang sama dengan saat menulis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Serialisasi Kustom: writeObject dan readObject” gratis?
Ya — teks lengkap “Serialisasi Kustom: writeObject dan readObject” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Serialisasi Kustom: writeObject dan readObject”?
Timpa writeObject dan readObject untuk enkripsi, kompresi, atau penanganan field kustom. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Serialisasi Kustom: writeObject dan readObject” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Serialisasi Java
- Field transient dan serialVersionUID
- Serialisasi Kustom: writeObject dan readObject
- Alternatif Modern: JSON dan Protocol Buffers