Java Academy · Les

Aangepaste serialisatie: writeObject en readObject

Overschrijf writeObject en readObject voor encryptie, compressie of aangepaste verwerking van velden.

Les 3 van 413 stappen

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.

Gratis beginnen

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

  1. De basis van Java-serialisatie
  2. transient-velden en serialVersionUID
  3. Aangepaste serialisatie: writeObject en readObject
  4. Moderne alternatieven: JSON en Protocol Buffers
← Terug naar Java Academy