Słowo kluczowe transient jest używane w Javie do oznaczania pól klasy, które powinny być wyłączone z procesu serializacji – to znaczy, te pola nie będą zapisywane podczas zapisywania obiektu do strumienia bajtów.
Jest to przydatne, gdy:
Przykład użycia:
import java.io.*; class User implements Serializable { private String username; private transient String password; // nie będzie serializowane public User(String username, String password) { this.username = username; this.password = password; } }
Po deserializacji pole password będzie miało wartość null.
Co się stanie, jeśli pole transient jest referencją do obiektu, który także implementuje Serializable?
Odpowiedź: Pole i tak nie jest serializowane – odnosi się to do pola, a nie do typu obiektu. Nawet jeśli obiekt implementuje Serializable, jeśli pole jest oznaczone jako transient, nie zostanie ono poddane serializacji obiektu, w którym jest transient.
Przykład:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
Pole credentials zawsze będzie null po deserializacji, nawet jeśli sama Credentials jest serializowalna.
Historia
W internetowym banku, przy projektowaniu obiektu "Sesja użytkownika", zapomniano zadeklarować pole sesji autoryzacyjnej jako transient, przez co serializowane obiekty były logowane razem z poufnymi informacjami do pliku. Doprowadziło to do wycieku danych osobowych.
Historia
W usłudze brokerskiej niektóre pola pamięci podręcznej były domyślnie serializowane. Po przywróceniu z serializowanego stanu aplikacja zaczęła korzystać ze starych danych z pamięci podręcznej, co doprowadziło do rozbieżności między rzeczywistymi a wyświetlanymi kwotami na rachunkach.
Historia
Programista zaimplementował pole transient, zakładając, że jego wartość zostanie automatycznie wypełniona po deserializacji. Nie zaimplementował customowej struktury (readObject/writeObject), w rezultacie pole pozostało null – program awaryjnie kończył działanie przy pierwszym dostępie do tego pola.