Java Academy · Oppitunti

Javan serialisoinnin perusteet

Toteuta Serializable, kirjoita olioita virtoihin ObjectOutputStreamillä ja lue ne takaisin.

Oppitunti 1/413 vaihetta

Javan serialisoinnin perusteet on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä Java-serialisointi on?

Serialisointi muuntaa olion tilan tavuvirraksi, jotta se voidaan tallentaa levylle, lähettää verkon kautta tai tallentaa tietokantaan. Deserialisointi tekee prosessin päinvastoin.

Serializable-merkintärajapinta

Jotta luokka voidaan serialisoida, sen on toteutettava java.io.Serializable. Rajapinnassa ei ole metodeja — se ilmoittaa JVM:lle, että tämän luokan oliot voidaan serialisoida.

import java.io.Serializable;
public class User implements Serializable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override public String toString() { return name + " / " + age; }
}

Olion kirjoittaminen ObjectOutputStreamilla

Käärikää FileOutputStream ObjectOutputStream-olioon ja kutsukaa writeObject()-metodia serialisoimiseksi.

import java.io.*;
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.ser"))) {
    oos.writeObject(new User("Alice", 30));
    System.out.println("Serialized successfully");
}

Olion lukeminen ObjectInputStreamilla

Käärikää FileInputStream ObjectInputStream-olioon ja kutsukaa readObject()-metodia deserialisoimiseksi. Muuntakaa tulos odotettuun tyyppiin.

import java.io.*;
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("user.ser"))) {
    User u = (User) ois.readObject();
    System.out.println("Deserialized: " + u);
}

Olioiden muodostaman graafin serialisointi

Kaikkien serialisoitavan olion viittaamien olioiden on myös toteutettava Serializable, muuten suorituksen aikana heitetään NotSerializableException.

public class Order implements Serializable {
    private User customer;   // User must be Serializable
    private List<String> items;
    public Order(User customer, List<String> items) {
        this.customer = customer;
        this.items = items;
    }
}

NotSerializableException

Jos jokin oliograafin kenttä ei ole serialisoitava eikä sitä ole merkitty transient-määreellä, Java heittää kirjoitushetkellä poikkeuksen NotSerializableException.

// Thread is NOT Serializable
public class Task implements Serializable {
    private Thread worker; // throws NotSerializableException!
    // Fix: mark as transient
    private transient Thread worker2;
}

Oliograafi ja jaetut viittaukset

Java seuraa olioiden identiteettiä serialisoinnin aikana. Jos kaksi kenttää viittaa samaan olioon, siitä kirjoitetaan vain yksi kopio, ja molemmat kentät viittaavat deserialisoinnin jälkeen samaan olio-instanssiin.

Kokoelmien serialisointi

Vakiokokoelmat, kuten ArrayList, HashMap ja LinkedList, toteuttavat jo valmiiksi Serializable-rajapinnan, joten ne voidaan serialisoida, kunhan myös niiden alkiot voidaan serialisoida.

List<String> names = new ArrayList<>(List.of("Alice", "Bob"));
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("names.ser"))) {
    oos.writeObject(names);
}

Periytyminen ja serialisointi

Jos yliluokka on Serializable, kaikki aliluokat ovat myös serialisoitavia. Jos yliluokka ei ole serialisoitava, yliluokan kenttiä ei tallenneta, ja yliluokalla on oltava parametriton konstruktori deserialisointia varten.

Tavuvirran tarkistaminen

Serialisoitu tavuvirta alkaa tunnistetavuilla 0xACED 0x0005. Voitte tarkastella sitä heksaeditorilla tai purkaa sen SerialVer-työkaluilla ymmärtääksenne muodon.

Tietoturvavaroitus

Javan deserialisointi on tunnettu hyökkäysvektori. Älkää koskaan deserialisoiko epäluotettavista lähteistä peräisin olevaa dataa ilman validointia. Käyttäkää ulkoiseen dataan mieluummin JSONia, Protocol Buffersia tai allekirjoitettuja kääreitä.

Pikatarkistus

Mikä metodi serialisoi olion virtaan?

Kertaus

Javan serialisointi käyttää luokkia ObjectOutputStream ja ObjectInputStream. Luokkien on toteutettava Serializable. Välttäkää epäluotettavan datan serialisointia ja suosikaa uudessa koodissa nykyaikaisia vaihtoehtoja.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Javan serialisoinnin perusteet” ilmainen?

Kyllä – oppitunnin ”Javan serialisoinnin perusteet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Javan serialisoinnin perusteet”?

Toteuta Serializable, kirjoita olioita virtoihin ObjectOutputStreamillä ja lue ne takaisin. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Javan serialisoinnin perusteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Javan serialisoinnin perusteet
  2. transient-kentät ja serialVersionUID
  3. Mukautettu serialisointi: writeObject ja readObject
  4. Nykyaikaiset vaihtoehdot: JSON ja Protocol Buffers
← Takaisin: Java Academy