transient anahtar kelimesi, Java'da bir sınıfın alanlarını belirlemek için kullanılır; seri hale getirme sürecinden hariç tutulması gereken alanları belirtir – yani, bu alanlar nesne bir byte akışına kaydedilirken saklanmayacaktır.
Bu, şu durumlarda faydalıdır:
Kullanım örneği:
import java.io.*; class User implements Serializable { private String username; private transient String password; // seri hale getirilmeyecek public User(String username, String password) { this.username = username; this.password = password; } }
Seri hale getirdikten sonra password alanı null değerine sahip olacaktır.
Eğer transient alan bir nesneye referanssa ve o nesne Serializable'ı uygularsa ne olur?
Cevap: Alan yine de seri hale getirilmeyecek – bu durum, alana özel olup, nesnenin türüne bağlı değildir. Alan transient olarak işaretlenmişse, nesne Serializable'ı uygulasa bile, o alanın seri hale getirilmesinde kaybolmayacaktır.
Örnek:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
credentials alanı, Credentials nesnesi serileştirilebilir olsa bile, deserileştirmeden sonra her zaman null olacaktır.
Hikaye
Bir internet bankasında "Kullanıcı Oturumu" nesnesini tasarlarken, oturumun kimlik doğrulama alanını transient olarak tanımlamayı unuttular, bu nedenle seri hale getirilmiş nesneler gizli bilgilerle dosyaya kaydedildi. Bu durum, kişisel verilerin sızmasına yol açtı.
Hikaye
Bir aracı kurumda bazı önbellek alanları varsayılan olarak seri hale getirildi. Seri hale getirilmiş durumdan geri yüklendikten sonra, uygulama önbellekten eski verileri kullanmaya başladı ve bu da hesaplarda gerçek ve gösterilen tutarlar arasında tutarsızlıklara yol açtı.
Hikaye
Bir geliştirici, transient alanının deserileştirmeden sonra otomatik olarak doldurulacağını varsayarak implementasyon yaptı. Özelleştirilmiş readObject/writeObject yapılarına sahip olmadığından, alan her zaman null kalıyordu – bu da bu alana ilk erişimde programın aniden kapanmasına neden oldu.