Serialisointi
Serialisointi tarkoittaa tietojenkäsittelytieteessä tietorakenteen muuttamista tiedostoon tai tietokantaan säilömistä varten tai toiselle koneelle lähettämiseen tietokoneverkon kautta.[1][2] Kun muutettu tietorakenne luetaan uudelleen ja palautetaan takaisin alkuperäiseen muotoonsa, on tuloksena identtinen versio alkuperäisestä tietorakenteesta. Serialisointia voi käyttää useimmissa yleisissä ohjelmointikielissä.[3]
Jotta serialisointia on mahdollista käyttää, tarvitaan tavat tiedon pakkaukseen ja sen muuttamiseen takaisin alkuperäiseen muotoon.[3] Muistissa olevat tavut järjestetään muotoon, josta ne voidaan tarvittaessa palauttaa käsiteltäväksi.[2] Aiheeseen liittyy paljon huomioitavia seikkoja: esimerkiksi tekstille käytettävä merkistö, tavujärjestys tai muut eri koodausmenetelmien erot.[1]
Eräissä yhteyksissä serialisointia kutsutaan jäsentämiseksi (engl. marshalling).[4][5] Huomaa, että tämä on kuitenkin eri asia kuin syntaktinen jäsentäminen (engl. parsing).
Serialisointi Javassa
Javassa ohjelmiston tiedot on tyypillisesti tallennettu oliomuodossa, mutta olion tallentaminen tiedostoon tekstitietona ei ole helppoa. Tämä johtuu siitä, että se vaatisi kaikkien olion kenttien muuttamista tekstiksi käsin aina, kun olio tallennetaan sekä tekstinä olevien tietojen lukemista ja uuden olion rakentamista luetuista tekstitiedoista aina, kun olio ladataan. Javassa erityisesti luokkien ja olioiden siirtäminen tietokoneelta toiselle tai niiden kirjoittaminen tiedostoon onnistuu parhaiten serialisoinnin avulla. Serialisoituja olioita on mahdollista lähettää tulostevirtaan tai lukea syötevirrasta, mikä helpottaa suuresti niiden siirtämistä.[3] Java tarjoaa serialisointia automaattisesti, ja sen saa käyttöönsä implementoimalla luokkaan java.io.Serializable
rajapinnan. Rajapinta kertoo Javalle, että luokka on mahdollista serialisoida. Lisäksi kaikkien luokassa olevien muuttujien on implementoitava tämä rajapinta. Yleensä tämä vaatimus koskee vain käyttäjän itse määrittelemiä luokkia, koska kaikki perustietotyypit ja lähes kaikki standardikirjaston yleisimmin käytetyistä luokista implementoivat Serializable-rajapinnan. Serialisointi on sisäänrakennettu Javaan, joten se osaa hoitaa serialisoinnin itse.[3] Kun luokka tai olio serialisoidaan, koko luokka eli mukaan lukien sen attribuutit ja metodit muutetaan tavujonoksi. Myös kaikkien rakenteiden tietotyypit otetaan mukaan serialisointiin. Kaikki oliot eivät kuitenkaan ole automaattisesti serialisoituvia.
Luokan ilmentymä voidaan muuttaa tekstimuotoon ObjectOutputStream-luokkaa hyödyntäen, jos luokka ja kaikki sen muuttujat implementoivat Serializable-rajapinnan. Luokan julkinen rakentaja ottaa OutputStream-olion, joka on datakuluttaja, johon serialisoituva objekti kirjoitetaan. Tämän jälkeen ilmentymästä voidaan kutsua ilmentymän writeObject-metodia serialisoituvalla oliolla. WriteObject-metodi kirjoittaa OutputStream-olioon olion serialisoidun tavutietoversion, joka on määritelty ObjectOutputStream-rakentajassa.[3]
ObejectInputStream-luokkaa käytetään vastaavasti luokan deserialisaatioon. InputStream-olio on tietosyöte, josta deserialisoituva objekti on luettavissa ja jonka luokan julkinen rakentaja ottaa sisäänsä. ReadObject-metodia voidaan kutsua ilmentymästä ilman argumentteja, ja se palauttaa deserialisoidun olion sen lukeman tavutiedon perusteella.[3]
On kolme pääsyytä, miksi objektit eivät ole oletusarvoisesti serialisoituvia, vaan niiden täytyy implementoida Serializable-rajapinta, jotta ne voivat käyttää Javan sisäänrakennettua serialisointia.
Ensinnäkin kaikki oliot eivät tallenna hyödyllisiä tietoja serialisoidussa tilassa, kuten esimerkiksi Thread-olio.
Toiseksi olion serialisoitu-tila on osa luokkien yhteensopivuussopimusta. Yhteensopivuuden ylläpitäminen serialisoituvien luokkien eri version välillä vaatii ylimääräistä työtä ja harkintaa. Siksi luokan serialisointi pitää olla harkittu suunnittelupäätös eikä oletusehto.
Lopuksi serialisointi mahdollistaa pääsyn luokan yksityisiin jäseniin, joita ei ole merkitty transient-määreellä ja joihin ei muutoin ole pääsyä.
Lähteet
- Serialization and Unserialization isocpp.org. Viitattu 9.9.2022. (englanniksi)
- Serialization (C#) docs.microsoft.com. 15.9.2021. Viitattu 9.9.2022. (englanniksi)
- Antti Herala, Erno Vanhala ja Uolevi Nikula: Olio-ohjelmointi Javalla 2015. LUT-yliopisto. Viitattu 29.3.2023.
- Marshal ruby-doc.org. Viitattu 9.9.2022. (englanniksi)
- Module Marshal v2.ocaml.org. Viitattu 9.9.2022. (englanniksi)