Aangepaste serialisatie: writeObject en readObject
Overschrijf writeObject en readObject voor encryptie, compressie of aangepaste verwerking van velden.
Aangepaste serialisatie: writeObject en readObject is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.
Wanneer standaardserialisatie niet volstaat
Standaardserialisatie slaat alle niet-transientvelden ongewijzigd op. Soms heb je versleuteling, compressie of een andere representatie nodig. Daarvoor zijn er de hooks writeObject en readObject.
writeObject declareren
Voeg een methode private void writeObject(ObjectOutputStream oos) toe. Java roept die aan in plaats van het standaardmechanisme. Je bepaalt precies wat er wordt geschreven.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject(); // write non-transient fields normally
oos.writeUTF(encrypt(this.secret)); // write encrypted secret
}readObject declareren
Voeg een methode private void readObject(ObjectInputStream ois) toe. Java roept die tijdens het deserialiseren aan. Je leest de gegevens in precies dezelfde volgorde als waarin je ze hebt geschreven.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject(); // restore non-transient fields
this.secret = decrypt(ois.readUTF()); // decrypt and restore
}De volgorde is belangrijk
Alles wat je in writeObject schrijft, moet in readObject in dezelfde volgorde worden teruggelezen. Een verkeerde volgorde veroorzaakt StreamCorruptedException.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.writeInt(version);
oos.writeUTF(data);
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
this.version = ois.readInt(); // same order
this.data = ois.readUTF();
}Gegevens comprimeren tijdens serialisatie
Wikkel de stream in GZIPOutputStream binnen writeObject om grote velden te comprimeren en gebruik vervolgens GZIPInputStream binnen readObject om ze te decomprimeren.
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try (GZIPOutputStream gz = new GZIPOutputStream(bos)) {
gz.write(largePayload.getBytes());
}
oos.writeObject(bos.toByteArray());
}De readResolve-hook
readResolve() wordt na het deserialiseren aangeroepen. Geef een vervangend object terug. Dat is nuttig voor singletons en enumeraties, zodat er na het deserialiseren maar één instantie bestaat.
public class AppConfig implements Serializable {
private static final AppConfig INSTANCE = new AppConfig();
private AppConfig() {}
public static AppConfig getInstance() { return INSTANCE; }
private Object readResolve() { return INSTANCE; } // return singleton
}De writeReplace-hook
writeReplace() wordt vóór het serialiseren aangeroepen. Geef een ander object terug dat in plaats daarvan moet worden geserialiseerd. Dat is nuttig voor proxypatronen en serialisatiesurrogaten.
private Object writeReplace() {
return new UserProxy(this.id); // serialize a lightweight proxy
}Velden valideren in readObject
Je kunt validatielogica toevoegen aan readObject om ongeldige of gemanipuleerde gegevens af te wijzen als onderdeel van een strategie voor gelaagde beveiliging.
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
if (age < 0 || age > 150) {
throw new InvalidObjectException("Invalid age: " + age);
}
}Versiewijzigingen afhandelen
Gebruik een versieveld in writeObject, zodat readObject tijdens migraties op een soepele manier zowel oude als nieuwe indelingen kan verwerken.
private static final int SERIAL_VERSION = 2;
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeInt(SERIAL_VERSION);
if (SERIAL_VERSION >= 2) oos.writeUTF(email); // new field
}
private void readObject(ObjectInputStream ois)
throws IOException, ClassNotFoundException {
ois.defaultReadObject();
int v = ois.readInt();
if (v >= 2) this.email = ois.readUTF();
}Het serialisatieproxypatroon
Een robuuste aanpak is om een private statische binnenklasse te schrijven die de minimale toestand vastlegt. Gebruik daarna writeReplace om de proxy te schrijven en de readResolve ervan om het oorspronkelijke object opnieuw op te bouwen.
Prestatieoverwegingen
Aangepaste serialisatie voegt overhead door methodeaanroepen toe, maar kan de omvang van de gegevenslading aanzienlijk verkleinen. Voer een benchmark uit voordat je optimaliseert; gebruik Externalizable voor maximale controle.
Korte controle
Wat moet waar zijn voor de volgorde in writeObject en readObject?
Samenvatting
Overschrijf writeObject en readObject voor versleuteling, compressie of aangepaste indelingen. Gebruik readResolve voor singletons. Lees altijd in dezelfde volgorde als waarin je schrijft.
Leer Java met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 104
- Lessen
- 374
Veelgestelde vragen
Is de les “Aangepaste serialisatie: writeObject en readObject” gratis?
Ja — de volledige tekst van “Aangepaste serialisatie: writeObject en readObject” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.
Wat leer ik in “Aangepaste serialisatie: writeObject en readObject”?
Overschrijf writeObject en readObject voor encryptie, compressie of aangepaste verwerking van velden. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Java Academy te beginnen?
Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Aangepaste serialisatie: writeObject en readObject”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Java Academy?
Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- De basis van Java-serialisatie
- transient-velden en serialVersionUID
- Aangepaste serialisatie: writeObject en readObject
- Moderne alternatieven: JSON en Protocol Buffers