Johdanto
Serialization on muuntaminen valtion esineen osaksi tavuvirran; deserialization ei päinvastoin. Toisin mainittu, serialization on muuntaminen Java-objektin staattinen virta (sequence) tavua, joka voidaan sitten tallentaa tietokantaan tai siirtää verkon yli.
Serialization ja Deserialization
serialization prosessi on esimerkiksi riippumaton, ts., objektit voidaan sarjalisoida yhdellä alustalla ja deserialisoida toisella. Luokat, jotka ovat oikeutettuja serialization täytyy toteuttaa erityinen merkki rajapinnan Serializable.
Molemmat ObjectInputStream ja ObjectOutputStream ovat korkean tason luokat, jotka ulottuvat java.io.InputStream ja java.io.OutputStream vastaavasti. ObjectOutputStream voi kirjoittaa alkeellisia tyyppejä ja kaavioita esineitä OutputStream kuin virta tavuja. Nämä virrat voidaan myöhemmin lukea ObjectInputStream.,
tärkein menetelmä ObjectOutputStream on:
public final void writeObject(Object o) throws IOException;
Joka vie serializable objekti ja muuntaa sen järjestyksessä (stream) tavua. Samoin, tärkein menetelmä ObjectInputStream on:
public final Object readObject() throws IOException, ClassNotFoundException;
Joka voi lukea stream tavua ja muuntaa se takaisin osaksi Java-objekti. Tämä voidaan sitten heittää takaisin alkuperäiseen kohteeseen.
kuvaillaan sarjallisuutta Henkilöluokalla. Huomaa, että staattiset kentät kuuluvat luokkaan (toisin kuin objekti) eivätkä ole sarjallistettuja., Huomaa myös, että voimme käyttää avainsanan ohimenevä sivuuttaa luokan kentät aikana serialization:
public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}
testi alla on esimerkki säästämisen kohde tyyppi Henkilö, paikallinen tiedosto ja lue sitten tämä arvo takaisin:
Me käytetään ObjectOutputStream säästää tilaa tämä kohde tiedostoon käyttäen FileOutputStream. Tiedosto ” yourfile.TXT” on luotu projektin hakemistoon. Tämä tiedosto ladataan sitten FileInputStream-ohjelmalla. ObjectInputStream poimii tämän virran ylös ja muuntaa sen uudeksi objektiksi nimeltä p2.,
lopulta testaamme ladatun esineen tilan, ja se vastaa alkuperäisen objektin tilaa.
Huomaa, että ladattu esine on nimenomaisesti valettu Henkilö tyyppi.
Java Serialization Varoitukset
On olemassa joitakin epävarmuustekijöitä, jotka koskevat serialization Java.
3.1. Perintö-ja Kokoonpano
Kun luokka toteuttaa java.io.Serializable käyttöliittymä, kaikki sen osa-luokat ovat serializable samoin., Päinvastoin, kun esine on viite toiseen kohteeseen, nämä esineet on toteuttaa Serializable käyttöliittymä erikseen, tai muuten NotSerializableException heitetään:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
Jos yksi kentät on korostettu kohde koostuu joukko esineitä, sitten kaikki nämä esineet täytyy olla serializable yhtä hyvin, tai muuten NotSerializableException heitetään.
3, 2. Serial Versio UID
JVM osakkuus-versio (pitkä) määrä jokaisen serializable-luokan., Sitä käytetään varmistamaan, että tallennetuilla ja ladatuilla esineillä on samat ominaisuudet ja ovat siten yhteensopivia sarjallistamisessa.
Tämä numero voidaan luoda automaattisesti useimmat IDEs ja perustuvat luokan nimi, sen ominaisuuksia ja siihen liittyvät määritteet. Mahdolliset muutokset johtavat eri määrään ja voivat aiheuttaa Invalidikiellon.
Jos serializable luokka ei julistaa serialVersionUID, JVM tuottaa yksi automaattisesti ohjelmanajon aikana., Kuitenkin, se on erittäin suositeltavaa, että jokainen luokka vakuuttaa sen serialVersionUID kuin luotu yksi on compiler riippuvainen ja voi siten aiheuttaa odottamattomia InvalidClassExceptions.
3.3. Custom Serialization Java
Java-määrittää oletuksena tapa, jolla esineet voidaan sarjoittaa. Java-luokat voivat ohittaa tämän oletuskäyttäytymisen. Custom serialization voi olla erityisen hyödyllinen, kun yrittää sarjoittaa objekti, joka on joitakin unserializable ominaisuuksia., Tämä voidaan tehdä järjestämällä kaksi menetelmiä sen luokan sisällä, että haluamme sarjoittaa:
private void writeObject(ObjectOutputStream out) throws IOException;
ja
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
näillä menetelmillä, voidaan sarjoittaa ne unserializable attribuutteja osaksi muita muotoja, jotka voidaan sarjoittaa:
public class Address { private int houseNumber; // setters and getters}
seuraava yksikkö testi, testit, tämä custom serialization:
tätä koodia, voimme nähdä, miten voit säästää unserializable ominaisuuksia, joita serializing-Osoite mukautettuja serialization. Huomaa, että meidän täytyy merkitä epäerializable attribuutit ohimenevä välttää Notterializeexception.,
Johtopäätös
tässä nopea opetusohjelma, olemme käyneet läpi Java serialization, käsitellään tärkeitä asioita pitää mielessä, ja on osoittanut, miten tehdä mukautettuja serialization.