0Pricing
Java Academy · Pelajaran

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

  1. Dasar-Dasar Serialisasi Java
  2. Field transient dan serialVersionUID
  3. Serialisasi Kustom: writeObject dan readObject
  4. Alternatif Modern: JSON dan Protocol Buffers
← Kembali ke Java Academy