Jawaban:
Kata transient
kunci dalam Java digunakan untuk menunjukkan bahwa suatu bidang tidak boleh menjadi bagian dari proses serialisasi (yang berarti disimpan, seperti ke file).
Dari Spesifikasi Bahasa Jawa , Edisi Java SE 7 , Bagian 8.3.1.3. transient
Bidang :
Variabel dapat ditandai
transient
untuk menunjukkan bahwa mereka bukan bagian dari keadaan gigih suatu objek.
Misalnya, Anda mungkin memiliki bidang yang berasal dari bidang lain, dan seharusnya hanya dilakukan secara terprogram, alih-alih keadaan dipertahankan melalui serialisasi.
Inilah GalleryImage
kelas yang berisi gambar dan gambar mini yang berasal dari gambar:
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
Dalam contoh ini, thumbnailImage
gambar thumbnail yang dihasilkan dengan memanggil generateThumbnail
metode.
The thumbnailImage
lapangan ditandai sebagai transient
, sehingga hanya asli image
serial daripada bertahan kedua gambar asli dan gambar thumbnail. Ini berarti bahwa penyimpanan yang lebih sedikit akan diperlukan untuk menyimpan objek serial. (Tentu saja, ini mungkin atau mungkin tidak diinginkan tergantung pada persyaratan sistem - ini hanya sebuah contoh.)
Pada saat deserialisasi, readObject
metode dipanggil untuk melakukan operasi yang diperlukan untuk mengembalikan keadaan objek kembali ke keadaan di mana serialisasi terjadi. Di sini, thumbnail perlu dibuat, sehingga readObject
metode ditimpa sehingga thumbnail akan dihasilkan dengan memanggil generateThumbnail
metode.
Untuk informasi tambahan, temukan rahasia artikel Java Serialization API (yang semula tersedia di Sun Developer Network) memiliki bagian yang membahas penggunaan dan menyajikan skenario di mana transient
kata kunci digunakan untuk mencegah serialisasi bidang-bidang tertentu.
Sebelum memahami transient
kata kunci, kita harus memahami konsep serialisasi. Jika pembaca tahu tentang serialisasi, lewati poin pertama.
Serialisasi adalah proses untuk membuat keadaan objek tetap. Itu berarti keadaan objek diubah menjadi aliran byte yang akan digunakan untuk bertahan (misalnya menyimpan byte dalam file) atau mentransfer (misalnya mengirim byte melalui jaringan). Dengan cara yang sama, kita dapat menggunakan deserialization untuk mengembalikan status objek dari byte. Ini adalah salah satu konsep penting dalam pemrograman Java karena serialisasi banyak digunakan dalam pemrograman jaringan. Objek-objek yang perlu ditransmisikan melalui jaringan harus dikonversi menjadi byte. Untuk tujuan itu, setiap kelas atau antarmuka harus mengimplementasikan Serializable
antarmuka. Ini adalah antarmuka marker tanpa metode apa pun.
transient
kata kunci dan tujuannya?Secara default, semua variabel objek bisa dikonversi menjadi status persisten. Dalam beberapa kasus, Anda mungkin ingin menghindari beberapa variabel karena Anda tidak perlu mempertahankan variabel-variabel tersebut. Jadi, Anda dapat mendeklarasikan variabel tersebut sebagai transient
. Jika variabel dinyatakan sebagai transient
, maka itu tidak akan bertahan. Itulah tujuan utama transient
kata kunci.
Saya ingin menjelaskan dua poin di atas dengan contoh berikut:
package javabeat.samples;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class NameStore implements Serializable{
private String firstName;
private transient String middleName;
private String lastName;
public NameStore (String fName, String mName, String lName){
this.firstName = fName;
this.middleName = mName;
this.lastName = lName;
}
public String toString(){
StringBuffer sb = new StringBuffer(40);
sb.append("First Name : ");
sb.append(this.firstName);
sb.append("Middle Name : ");
sb.append(this.middleName);
sb.append("Last Name : ");
sb.append(this.lastName);
return sb.toString();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
// writing to object
o.writeObject(nameStore);
o.close();
// reading from object
ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
NameStore nameStore1 = (NameStore)in.readObject();
System.out.println(nameStore1);
}
}
Dan hasilnya adalah sebagai berikut:
First Name : Steve
Middle Name : null
Last Name : Jobs
Nama Tengah dinyatakan sebagai transient
, sehingga tidak akan disimpan dalam penyimpanan persisten.
NameFormatter
ke drive yang digunakan toString()
. Atau hal lain yang terkait dengan konfigurasi, atau tampilan, atau logika bisnis, ... yang bertentangan dengan data.
Untuk memungkinkan Anda menentukan variabel yang tidak ingin Anda buat bersambung.
Dalam sebuah objek Anda mungkin memiliki informasi yang tidak ingin Anda buat bersambung / bertahan (mungkin referensi ke objek pabrik induk), atau mungkin tidak masuk akal untuk membuat cerita bersambung. Menandai ini sebagai 'sementara' berarti mekanisme serialisasi akan mengabaikan bidang ini.
Kontribusi kecil saya:
Apa itu bidang sementara?
Pada dasarnya, bidang apa pun yang dimodifikasi dengan transient
kata kunci adalah bidang sementara.
Mengapa bidang sementara dibutuhkan di Jawa?
Kata transient
kunci memberi Anda kontrol atas proses serialisasi dan memungkinkan Anda mengecualikan beberapa properti objek dari proses ini. Proses serialisasi digunakan untuk bertahan objek Java, sebagian besar sehingga negara mereka dapat dipertahankan saat mereka ditransfer atau tidak aktif. Terkadang, masuk akal untuk tidak membuat serial atribut tertentu dari suatu objek.
Bidang mana yang harus Anda tandai sementara?
Sekarang kita tahu tujuan daritransient
kata kunci dan bidang sementara, penting untuk mengetahui bidang mana yang menandai sementara. Bidang statis juga tidak diserialisasi, jadi kata kunci yang sesuai juga akan melakukan trik. Tetapi ini mungkin merusak desain kelas Anda; Di sinilah transient
kata kunci datang untuk menyelamatkan. Saya mencoba untuk tidak membiarkan bidang yang nilainya dapat diturunkan dari orang lain untuk serial, jadi saya tandai mereka sementara. Jika Anda memiliki bidang bernama interest
yang nilainya dapat dihitung dari bidang lain ( principal
, rate
& time
), tidak perlu diserialisasi.
Contoh lain yang baik adalah dengan jumlah kata artikel. Jika Anda menyimpan seluruh artikel, benar-benar tidak perlu menyimpan jumlah kata, karena itu dapat dihitung ketika artikel menjadi "deserialized." Atau pikirkan tentang penebang;Logger
contoh hampir tidak pernah perlu serial, sehingga dapat dibuat sementara.
transient
transient
Sebuah transient
variabel adalah variabel yang tidak dapat serial.
Salah satu contoh kapan ini mungkin berguna yang muncul dalam pikiran adalah, variabel yang hanya masuk akal dalam konteks contoh objek tertentu dan yang menjadi tidak valid setelah Anda membuat serial dan deserialized objek. Dalam hal ini berguna untuk menjadikan variabel-variabel itu sebagai null
gantinya sehingga Anda dapat menginisialisasi ulang mereka dengan data yang berguna saat dibutuhkan.
transient
digunakan untuk menunjukkan bahwa bidang kelas tidak perlu diserialisasi. Mungkin contoh terbaik adalah Thread
bidang. Biasanya tidak ada alasan untuk membuat serial a Thread
, karena kondisinya sangat 'spesifik aliran'.
A
mereferensikan kelas tidak serialerial B
(seperti Thread
pada contoh Anda), maka A
harus menandai referensi sebagai transient
XOR harus mengabaikan proses serialisasi default untuk melakukan sesuatu yang masuk akal dengan B
XOR mengasumsikan bahwa hanya subclass serializable B
yang benar-benar dirujuk. (jadi subclass yang sebenarnya harus mengurus induk "buruk" mereka B
) XOR menerima bahwa serialisasi akan gagal. Hanya dalam satu kasus (ditandai sebagai sementara) B
secara otomatis dan diam-diam dilewati.
Sistem serialisasi selain yang asli Jawa juga dapat menggunakan pengubah ini. Hibernate, misalnya, tidak akan bertahan bidang ditandai dengan @Transient atau pengubah sementara . Terracotta juga menghormati pengubah ini.
Saya percaya arti kiasan dari pengubah adalah "bidang ini hanya untuk penggunaan dalam memori. Jangan bertahan atau memindahkannya di luar VM khusus ini dengan cara apa pun. Ini tidak portabel". yaitu Anda tidak dapat mengandalkan nilainya di ruang memori VM lain. Mirip volatile, Anda tidak bisa mengandalkan memori dan semantik utas tertentu.
transient
tidak akan menjadi kata kunci jika dirancang pada saat ini. Mereka mungkin menggunakan anotasi.
Karena tidak semua variabel bersifat serializable
Sebelum saya menjawab pertanyaan ini, saya harus menjelaskan kepada Anda SERIALISASI , karena jika Anda mengerti apa artinya serialisasi dalam ilmu komputer Anda dapat dengan mudah memahami kata kunci ini.
Serialisasi
Ketika suatu objek ditransfer melalui jaringan / disimpan pada media fisik (file, ...), objek tersebut harus "serial". Serialisasi mengubah seri objek status byte. Bytes ini dikirim pada jaringan / disimpan dan objek dibuat kembali dari byte ini.
Contoh
public class Foo implements Serializable
{
private String attr1;
private String attr2;
...
}
Sekarang JIKA ANDA INGIN lakukan TIDAK TRANSFERT / DISELAMATKAN bidang objek ini SO , Anda dapat menggunakan kata kunci transient
private transient attr2;
Ini diperlukan ketika Anda tidak ingin berbagi beberapa data sensitif yang disertai dengan serialisasi.
Thread
(kredit ke @AH misalnya), dalam hal ini Anda akan menandainya sebagai sementara. Namun, utas bukan data sensitif dalam dan dari dirinya sendiri, itu hanya tidak masuk akal logis untuk membuat cerita bersambung (dan itu tidak bisa serial).
Sesuai google makna sementara == hanya berlangsung untuk waktu yang singkat; tidak permanen.
Sekarang jika Anda ingin membuat apa pun sementara di java gunakan kata kunci sementara.
T: di mana harus menggunakan transient?
A: Secara umum di java kita bisa menyimpan data ke file dengan memperolehnya dalam variabel dan menulis variabel itu ke file, proses ini dikenal sebagai Serialisasi. Sekarang jika kita ingin menghindari data variabel untuk ditulis ke file, kita akan menjadikan variabel itu sementara.
transient int result=10;
Catatan: variabel transien tidak bisa lokal.
Sederhananya, kata kunci java sementara melindungi bidang dari Serialize sebagai bagian penghitung bidang non-transien mereka.
Dalam potongan kode ini BaseJob abstrak kelas kami mengimplementasikan antarmuka Serializable, kami memperluas dari BaseJob tetapi kami tidak perlu membuat serial sumber remote dan sumber data lokal; serialkan hanya bidang organisasiNama dan isSynced.
public abstract class BaseJob implements Serializable{
public void ShouldRetryRun(){}
}
public class SyncOrganizationJob extends BaseJob {
public String organizationName;
public Boolean isSynced
@Inject transient RemoteDataSource remoteDataSource;
@Inject transient LocalDaoSource localDataSource;
public SyncOrganizationJob(String organizationName) {
super(new
Params(BACKGROUND).groupBy(GROUP).requireNetwork().persist());
this.organizationName = organizationName;
this.isSynced=isSynced;
}
}
Kode contoh sederhana untuk kata kunci sementara.
import java.io.*;
class NameStore implements Serializable {
private String firstName, lastName;
private transient String fullName;
public NameStore (String fName, String lName){
this.firstName = fName;
this.lastName = lName;
buildFullName();
}
private void buildFullName() {
// assume building fullName is compuational/memory intensive!
this.fullName = this.firstName + " " + this.lastName;
}
public String toString(){
return "First Name : " + this.firstName
+ "\nLast Name : " + this.lastName
+ "\nFull Name : " + this.fullName;
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
buildFullName();
}
}
public class TransientExample{
public static void main(String args[]) throws Exception {
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("ns"));
o.writeObject(new NameStore("Steve", "Jobs"));
o.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream("ns"));
NameStore ns = (NameStore)in.readObject();
System.out.println(ns);
}
}
Bidang yang dideklarasikan dengan pengubah sementara tidak akan mengambil bagian dalam proses serial. Ketika suatu objek diserialisasi (disimpan dalam keadaan apa pun), nilai bidang transiennya diabaikan dalam representasi serial, sedangkan bidang selain bidang transien akan mengambil bagian dalam proses serialisasi. Itulah tujuan utama kata kunci sementara.
@DoNotSerialize
?