Kata kunci transien Java
1. Fungsi dan metode penggunaan sementara
Kita semua tahu bahwa selama suatu objek mengimplementasikan antarmuka yang dapat serilizable, objek dapat diserialisasi. Model serialisasi Java ini memberikan banyak kenyamanan bagi pengembang. Kami tidak harus berhubungan dengan proses serialisasi tertentu. Selama kelas ini mengimplementasikan antarmuka yang dapat diserahkan, semua properti dan metode kelas ini akan secara otomatis diserialisasi.
Namun, dalam proses pengembangan yang sebenarnya, kita sering mengalami masalah seperti itu. Beberapa sifat kelas ini perlu diserialisasi, sementara sifat lain tidak perlu diserialisasi. Misalnya, jika pengguna memiliki beberapa informasi sensitif (seperti kata sandi, nomor kartu bank, dll.), Untuk alasan keamanan, ia tidak ingin ditransmisikan dalam operasi jaringan (terutama melibatkan operasi serialisasi, cache serialisasi lokal juga berlaku), dan variabel yang sesuai dengan informasi ini dapat ditambahkan dengan kata kunci sementara. Dengan kata lain, siklus hidup bidang ini hanya ada dalam ingatan penelepon dan tidak ditulis ke disk untuk kegigihan.
Singkatnya, kata kunci transien Java memberi kita kenyamanan. Anda hanya perlu mengimplementasikan antarmuka yang dapat serilizable dan menambahkan kata kunci sementara sebelum atribut yang tidak perlu diserialisasi. Saat membuat serial objek, atribut ini tidak akan diserialisasi ke tujuan yang ditentukan.
Kode contoh adalah sebagai berikut:
impor java.io.fileInputStream; impor java.io.filenotfoundException; impor java.io.fileoutputstream; impor java.io.ioException; impor java.io.objectInputStream; impor java.o.objectOutputstream; impor java.io.serize.serize.dricription; variable* Note that when reading, the order of reading data must be consistent with the order of storing data* * @author Alexia * @date 2013-10-15 * http://www.manongjc.com/article/1609.html */public class TransientTest { public static void main(String[] args) { User user = new User(); user.setusername ("Alexia"); user.setpasswd ("123456"); System.out.println ("Baca Sebelum Serializable:"); System.out.println ("Nama pengguna:" + user.getusername ()); System.err.println ("Kata sandi:" + user.getPasswd ()); coba {ObjectOutputStream OS = ObjectOutputStream baru (FileOutputStream baru ("c: /user.txt")); os.writeObject (pengguna); // tulis objek pengguna ke dalam file os.flush (); os.close (); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } coba {ObjectInputStream adalah = ObjectInputStream baru (FileInputStream baru ("c: /user.txt")); user = (user) is.readObject (); // Baca data pengguna dari stream is.close (); System.out.println ("/nread setelah serializable:"); System.out.println ("Nama pengguna:" + user.getusername ()); System.err.println ("Kata sandi:" + user.getPasswd ()); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); }}} kelas Pengguna mengimplementasikan serializable {private static final long serialversionuid = 8294180014912103005L; nama pengguna string pribadi; Passwd string transien pribadi; string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassWD () {return passWD; } public void setPassWD (string passWD) {this.passwd = passWd; }}Outputnya adalah:
Baca Sebelum Serializable: Nama Pengguna: Alexiapassword: 123456Read Setelah Serializable: Nama Pengguna: Alexiapassword: Null
Bidang kata sandi adalah nol, yang berarti tidak ada informasi yang diperoleh dari file selama deserialisasi.
2. Ringkasan Penggunaan Transien
1) Setelah variabel dimodifikasi dengan transien, variabel tidak akan lagi menjadi bagian dari kegigihan objek, dan isi variabel tidak dapat diakses setelah serialisasi.
2) Kata kunci sementara hanya dapat memodifikasi variabel, tetapi bukan metode dan kelas. Perhatikan bahwa variabel lokal tidak dapat dimodifikasi dengan kata kunci sementara. Jika suatu variabel adalah variabel kelas yang ditentukan pengguna, kelas perlu mengimplementasikan antarmuka serial yang dapat diseriali.
3) Variabel yang dimodifikasi oleh kata kunci sementara tidak dapat lagi diserialisasi. Variabel statis tidak dapat diserialisasi terlepas dari apakah itu dimodifikasi dengan sementara.
Poin ketiga mungkin membingungkan, karena saya menemukan bahwa setelah menambahkan kata kunci statis ke bidang nama pengguna di kelas pengguna, hasil program menjalankan tetap tidak berubah, yaitu, nama pengguna jenis statis juga dibaca sebagai "Alexia". Bukankah ini bertentangan dengan poin ketiga? Sebenarnya, ini seperti ini: Poin ketiga memang benar (variabel statis tidak dapat diserialisasi terlepas dari apakah itu dimodifikasi dengan sementara). Setelah deserialisasi, nama pengguna variabel statis di kelas adalah nilai variabel statis yang sesuai dalam JVM saat ini. Nilai ini tidak berasal dari deserialisasi dalam JVM. Tidak percaya? Oke, izinkan saya membuktikannya di bawah ini:
impor java.io.fileInputStream; impor java.io.filenotfoundException; impor java.io.fileoutputstream; impor java.io.ioException; impor java.io.objectInputStream; impor java.o.objectOutputstream; impor java.io.serize.serize.dricription; Variabel * Perhatikan bahwa saat membaca, urutan data membaca harus konsisten dengan urutan menyimpan data * * @author Alexia * @Date 2013-10-15 * http://www.manongjc.com */kelas publik TransientTest {public static void main (string [] args) {pengguna pengguna = baru (); user.setusername ("Alexia"); user.setpasswd ("123456"); System.out.println ("Baca Sebelum Serializable:"); System.out.println ("Nama pengguna:" + user.getusername ()); System.err.println ("Kata sandi:" + user.getPasswd ()); coba {ObjectOutputStream OS = ObjectOutputStream baru (FileOutputStream baru ("c: /user.txt")); os.writeObject (pengguna); // tulis objek pengguna ke dalam file os.flush (); os.close (); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } coba {// ubah nilai nama pengguna sebelum deserialization user.username = "jmwang"; ObjectInputStream adalah = ObjectInputStream baru (FileInputStream baru ("c: /user.txt")); user = (user) is.readObject (); // Baca data pengguna dari stream is.close (); System.out.println ("/nread setelah serializable:"); System.out.println ("Nama pengguna:" + user.getusername ()); System.err.println ("Kata sandi:" + user.getPasswd ()); } catch (FileNotFoundException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); } catch (ClassNotFoundException e) {E.PrintStackTrace (); }}} kelas Pengguna mengimplementasikan serializable {private static final long serialversionuid = 8294180014912103005L; Nama pengguna string statis publik; Passwd string transien pribadi; string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassWD () {return passWD; } public void setPassWD (string passWD) {this.passwd = passWd; }}Hasil operasinya adalah:
Baca Sebelum Serializable: Nama Pengguna: Alexiapassword: 123456Read After Serializable: Nama Pengguna: JMwangpassword: NULL
Ini berarti bahwa nilai nama pengguna dari variabel statis di kelas deserialized adalah nilai dari variabel statis yang sesuai dalam JVM saat ini, yang merupakan JMWang yang dimodifikasi, bukan nilai Alexia selama serialisasi.
3. Detail Penggunaan Transien - Dapatkah variabel yang dimodifikasi oleh kata kunci transien benar -benar diserialisasi?
Pikirkan tentang contoh -contoh berikut:
impor java.io.externalizable; import java.io.file; impor java.io.fileInputStream; impor java.io.fileoutputStream; import java.io.ioException; import java. @Date 2013-10-15 * */kelas publik ExternalizableTest mengimplementasikan eksternalisasi {private transient string content = "Ya, saya akan diserialisasi terlepas dari apakah saya dimodifikasi oleh kata kunci sementara atau tidak"; @Override public void writeExternal (ObjectOutput out) melempar ioException {out.writeObject (content); } @Override public void readexternal (objectInput in) melempar ioException, classNotFoundException {content = (string) in.readObject (); } public static void main (string [] args) melempar Exception {externalizableTest et = new ExternalizableTest (); ObjectOutput out = ObjectOutputStream baru (FileOutputStream baru (file baru ("test"))); out.writeObject (ET); ObjectInput di = ObjectInputStream baru (FileInputStream baru (file baru ("test"))); ET = (ExternalizableTest) in.readObject (); System.out.println (ET.Content); out.close (); melampirkan(); }}Akankah variabel konten diserialisasi? Oke, saya telah mengeluarkan semua jawaban, ya, hasilnya adalah:
Ya, saya akan serial, terlepas dari apakah saya dimodifikasi dengan kata kunci sementara atau tidak
Mengapa ini? Tidakkah dikatakan bahwa variabel kelas tidak akan diserialisasi setelah dimodifikasi oleh kata kunci sementara?
Kita tahu bahwa di Java, serialisasi objek dapat diimplementasikan dengan mengimplementasikan dua antarmuka. Jika antarmuka serializable diimplementasikan, semua serialisasi akan dilakukan secara otomatis. Jika antarmuka yang dapat dieksternalisasi diimplementasikan, tidak ada yang dapat diserialisasi secara otomatis. Anda perlu menentukan secara manual variabel yang akan diserialisasi dalam metode WriteExternal, yang tidak ada hubungannya dengan apakah itu dimodifikasi oleh sementara. Oleh karena itu, contoh kedua mengeluarkan konten yang diinisialisasi oleh konten variabel, bukan nol.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!