Serijalizacija je mehanizam pretvaranja objekta u stream bajtova, deserijalizacija je obrnut proces, koji stvara objekat u memoriji.
Prvi deo projekta Serijalizacija pravi fajl sa .ser ekstenzijom i u njega smesta tok bajtova objekta klase Knjiga.
Drugi deo projekta Deserijalizacija ucitava taj fajl i iz njega pravi objekat Knjiga. Jedno polje je namerno postavljeno na transient, ti podaci se nece deserijalizovati.
Ova konverzija objekata omogucava da oni mogu da se salju preko mreze, da se cuvaju u fajlu ili u bazi podataka zbog neke kasnije upotrebe, takodje je serijalizovanje neophodno zbog RMI (Remote Method Invocation). RMI omogucava da objekat na jednoj masini pozove metodu objekta na drugoj masini. Stream bajtova se cuva u fajlu sa .SER ekstenzijom, koji kao takav je nezavistan od platforme na kojoj se koristi.
Interfejs Serializable:
Serializable je prazan interfejs, nema nikakva polja ni metode. On omogucava serijalizovanje za one klase koje ga implementiraju. Sve potklase od klase koja implementira interfejs Serializable takodje mogu da budu serijalizovane.
Klase FileOutputStream i ObjectOutputStream:
predstavljaju izlazni tok podataka, pomocu koga mozemo da upisujemo bajtove u datoteke. Za izradu objekta FileOutputStream nije potrebno da zadata datoteka postoji, objekat ce je sam napraviti i otvoriti za upisivanje.
Klase FileInputStream i ObjectInputStream:
Prave objekat koji omogucava ucitavanje bajtova iz datoteke
Koraci za Serijalizaciju:
- Klasa mora da implementira Serializable interfejs
- FileOutputStream fos = new FileOutputStream(fajl)
- ObjectOutputStream oos = new ObjectOutputStream(fos)
- oos.writeObject(object_za_serijalizaciju)
Koraci za deserijalizaciju:
- napraviti identicnu klasu u novom projektu za deserijalizaciju
- deklarisati objekat, ne instancirati ga
- FileInputSream fis = new FileInputStream(putanja_do_fajla)
- ObjectInputStrean ois = ObjectInputStream(fis)
- objectName = (Class)ois.readObject() -> mora da se kastuje kao tip klase koju hocemo da deserijalizujemo zato sto tip klase koja se deserijalizuje nije zabelezen pa mi moramo to da naznacimo
serialVersionUID:
Ovo je jedinstvena verzija ID-a za klasu koja moze da se serijalizuje. On funkcionise kao broj verzije te konkretne serijalizacije, on potvrdjuje da posiljalac i primalac serijalizovanog objekta imaju identicne klase za taj objekat i omogucava da taj objekat bude kompatibilan izmedju razlicitih masina. SerialVersionUID se na obe strane serijalizacije mora poklapati, inace ce biti ispaljena greska InvalidClassException. On se racuna na osnovu osobina klase, njenih polja, clanova itd ali mi mozemo da deklarisemo nas SerialVersionUID rucno kao private static final long polje:
private static final long serialVersionUID = 1L;
Da bi smo videli koji je serialVersionUID, koristimo ObjectStreamClass:
long serialVersionUID = ObjectStreamClass.lookup(serijal_obj.getClass()).getSerialVersionUID();
modifikatori STATIC i TRANSIENT
Staticka polja se ne serijalizuju, jer ona pripadaju klasi a ne objektu.
Transient polja se takodje ne serijalizuju, ona ce biti ignorisana.