0Pricing
Java Academy · Pelajaran

Field transient dan serialVersionUID

Kecualikan field sensitif dengan transient dan pertahankan kompatibilitas versi dengan serialVersionUID.

Field transient dan serialVersionUID adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Mengapa transient?

Beberapa bidang tidak boleh disimpan: kata sandi, handel berkas yang terbuka, dan perhitungan yang tersimpan dalam cache. Tandai bidang tersebut sebagai transient agar dilewati selama serialisasi.

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

Nilai Bidang transient Setelah Deserialisasi

Setelah deserialisasi, bidang transient menerima nilai bawaan Java: null untuk objek, 0 untuk angka, dan false untuk boolean.

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

Apa Itu serialVersionUID?

serialVersionUID adalah konstanta long yang berfungsi sebagai penanda versi. Jika kelas berubah dan UID-nya tidak cocok dengan UID dalam berkas, deserialisasi akan melempar InvalidClassException.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

UID yang Dibuat Otomatis vs UID Eksplisit

Jika Anda tidak mencantumkan serialVersionUID, Java membuatnya dari struktur kelas. Perubahan bidang apa pun akan mengubah UID secara diam-diam dan merusak data lama. Selalu deklarasikan UID secara eksplisit.

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

InvalidClassException akibat Ketidakcocokan Versi

Saat membaca data lama yang diserialisasi dengan kelas yang UID-nya telah berubah, Java akan melempar InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Evolusi Kelas yang Aman

Anda dapat menambahkan bidang baru ke kelas yang dapat diserialisasi tanpa mengubah UID. Aliran lama akan dideserialisasi dengan bidang baru yang memiliki nilai bawaan. Menghapus atau mengganti nama bidang lebih berisiko.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email; // Added in v2 — safe if UID unchanged
}

transient dengan Inisialisasi Tertunda

Pola yang umum: tandai bidang tersimpan dalam cache atau bidang turunan sebagai transient, lalu hitung ulang bidang tersebut secara tertunda setelah deserialisasi menggunakan readResolve atau di pengambilnya.

public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    private String content;
    private transient int wordCount = -1;
    public int getWordCount() {
        if (wordCount == -1) wordCount = content.split("\\s+").length;
        return wordCount;
    }
}

Bidang Statis Tidak Pernah Diserialisasi

Bidang static dimiliki oleh kelas, bukan instans. Bidang tersebut tidak pernah disertakan dalam aliran yang diserialisasi — hanya bidang instans yang diserialisasi.

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

Menggunakan Alat serialver

Alat JDK serialver mencetak serialVersionUID bawaan untuk sebuah kelas: serialver com.example.User. Gunakan alat ini untuk memperoleh nilainya sebelum menambahkannya secara eksplisit.

Serialisasi Eksternal sebagai Alternatif

Externalizable memperluas Serializable dan memberikan kendali penuh melalui writeExternal / readExternal — berguna jika Anda menginginkan kendali eksplisit atas bidang tanpa transient.

public class Config implements Externalizable {
    private String host;
    private transient String secret;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(host);
    }
    public void readExternal(ObjectInput in) throws IOException {
        host = in.readUTF();
    }
}

Praktik Terbaik

Selalu deklarasikan serialVersionUID. Tandai kata sandi, handel, dan cache sebagai transient. Naikkan UID saat membuat perubahan yang tidak kompatibel. Dokumentasikan riwayat versinya.

Pemeriksaan Singkat

Nilai apa yang dimiliki bidang transient int setelah deserialisasi?

Ringkasan

Gunakan transient untuk mengecualikan bidang dari serialisasi. Selalu deklarasikan serialVersionUID untuk mengendalikan pembuatan versi. Bidang statis tidak pernah diserialisasi dalam keadaan apa pun.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Field transient dan serialVersionUID” gratis?

Ya — teks lengkap “Field transient dan serialVersionUID” 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 “Field transient dan serialVersionUID”?

Kecualikan field sensitif dengan transient dan pertahankan kompatibilitas versi dengan serialVersionUID. 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 2 dari 4.

Berapa lama pelajaran “Field transient dan serialVersionUID” 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