Het sleutelwoord transient wordt in Java gebruikt om velden van een klasse aan te geven die moeten worden uitgesloten van het serialisatieproces – dat wil zeggen, deze velden worden niet opgeslagen wanneer het object naar een byte-stroom wordt opgeslagen.
Dit is nuttig wanneer:
Voorbeeld van gebruik:
import java.io.*; class User implements Serializable { private String username; private transient String password; // zal niet worden geserialiseerd public User(String username, String password) { this.username = username; this.password = password; } }
Na deserialisatie zal het veld password de waarde null hebben.
Wat gebeurt er als een transient-veld een verwijzing is naar een object dat zelf Serializable implementeert?
Antwoord: Het veld wordt nog steeds niet geserialiseerd – dit geldt voor het veld, niet voor het type object. Zelfs als het object Serializable implementeert, wordt het niet opgenomen in de serialisatie van dat object waar het transient is.
Voorbeeld:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
Het veld credentials zal altijd null zijn na deserialisatie, zelfs als Credentials zelf serialiseerbaar is.
Verhaal
In een online bank, bij het ontwerpen van het "Gebruikerssessie" object, was het veld van de autorisatiesessie vergeten als transient te verklaren, waardoor de geserialiseerde objecten samen met vertrouwelijke informatie in een bestand werden gelogd. Dit leidde tot een lek van persoonlijke gegevens.
Verhaal
In een brokerservice werden sommige cache-velden standaard geserialiseerd. Na herstel uit een geserialiseerde staat begon de applicatie verouderde gegevens uit de cache te gebruiken, wat leidde tot discrepanties tussen de echte en weergegeven bedragen op rekeningen.
Verhaal
Een ontwikkelaar implementeerde een transient-veld, denkend dat de waarde automatisch zou worden ingevuld na deserialisatie. Hij implementeerde geen aangepaste readObject/writeObject-structuur, met als gevolg dat het veld null bleef – het programma crashte bij de eerste toegang tot dit veld.