Geschiedenis van de vraag:
Java ondersteunt sinds het begin het mechanisme voor het serialiseren van objecten via de Serializable-interface. Soms is het nodig om de toestand van een object op te slaan, maar niet alle velden moeten worden geserialiseerd — bijvoorbeeld, ze kunnen gevoelig zijn voor veiligheid of dynamisch worden berekend. Hiervoor is de transient-modificator bedacht.
Probleem:
Als je een object als geheel serializeert, zonder rekening te houden met de kenmerken van individuele velden, kun je de lek van privé- of niet-serieelbare gegevens riskeren. Bovendien kan het serialiseren en deserialiseren van zware of tijdelijke velden (bijvoorbeeld streams, databaseverbindingen) leiden tot fouten of prestatieverlies.
Oplossing:
Gebruik de transient-modificator voor velden die niet moeten worden geserialiseerd bij het opslaan van het object. Dergelijke velden worden gewoon genegeerd door het serialisatiemechanisme en krijgen bij deserialisatie standaardwaarden (bijvoorbeeld null voor referentietypen of 0 voor nummers).
Voorbeeldcode:
import java.io.*; class User implements Serializable { private String username; private transient String password; // Wordt niet geserialiseerd! public User(String username, String password) { this.username = username; this.password = password; } }
Belangrijke kenmerken:
Kan een statisch veld transient zijn?
Antwoord: Je kunt een veld declareren als static transient, maar dat heeft geen zin: statische velden worden al niet geserialiseerd, omdat ze tot de klasse behoren en niet tot het object.
Kun je volledige controle hebben over de serialisatie van transient-velden?
Antwoord: Ja, door de methoden private void writeObject(ObjectOutputStream out) en private void readObject(ObjectInputStream in) te implementeren, kun je zelfs transient-velden indien nodig zelf serialiseren.
Voorbeeldcode:
private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); // out.writeObject(password); // als je het transient-veld expliciet wilt serialiseren }
Wat gebeurt er met een final transient veld na deserialisatie?
Antwoord: final transient-velden krijgen ook standaardwaarden (meestal nul of null), maar daarna kunnen ze niet meer worden gewijzigd zonder speciale trucs, wat vaak leidt tot bugs.
We hebben een object met een transient-veld DatabaseConnection geserialiseerd. Na deserialisatie hebben we geprobeerd methoden van deze verbinding aan te roepen — kregen een NullPointerException.
Voordelen:
Nadelen:
We hebben een User-object met een transient-wachtwoord geserialiseerd, en bij deserialisatie hebben we in readObject het wachtwoord aan de gebruiker gevraagd of de verbinding hersteld.
Voordelen:
Nadelen: