Introducere
serializarea este conversia stării unui obiect într-un flux de octeți; deserializarea face contrariul. Declarat diferit, serializarea este conversia unui obiect Java într-un flux static (secvență) de octeți care pot fi apoi salvate într-o bază de date sau transferate într-o rețea.
serializare și deserializare
procesul de serializare este independent de instanță, adică., obiectele pot fi serializate pe o platformă și deserializate pe alta. Clasele care sunt eligibile pentru serializare trebuie să pună în aplicare o interfață specială marker Serializable.
Ambele ObjectInputStream si ObjectOutputStream sunt ridicate la nivel de clase care extinde java.io.InputStream și java.io.OutputStream respectiv. ObjectOutputStream poate scrie tipuri primitive și grafice de obiecte la un OutputStream ca un flux de octeți. Aceste fluxuri pot fi ulterior citite folosind ObjectInputStream.,
Cea mai importantă metodă în ObjectOutputStream este:
public final void writeObject(Object o) throws IOException;
Care are o serializable obiect și îl convertește într-o succesiune (flux) de bytes. În mod similar, cea mai importantă metodă în ObjectInputStream este:
public final Object readObject() throws IOException, ClassNotFoundException;
Care poate citi un flux de octeți și de a converti înapoi la un obiect Java. Acest lucru poate fi apoi aruncat înapoi la obiectul original.
să ilustrăm serializarea cu o clasă de persoane. Rețineți că câmpurile statice aparțin unei clase (spre deosebire de un obiect) și nu sunt serializate., De asemenea, rețineți că putem folosi cuvinte cheie tranzitorie a ignora clasa domenii timpul 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}
testul de mai jos arată un exemplu de economisire a un obiect de tip Persoana cu un fișier local apoi citiți această valoare înapoi în:
Am folosit ObjectOutputStream pentru salvarea statului de acest obiect într-un fișier folosind FileOutputStream. Fișierul ” yourfile.txt ” este creat în directorul de proiect. Acest fișier este apoi încărcat folosind FileInputStream. ObjectInputStream preia acest flux și îl transformă într-un obiect nou numit p2.,în cele din urmă, testăm starea obiectului încărcat și se potrivește cu starea obiectului original.
observați că obiectul încărcat trebuie să fie exprimate în mod explicit la un tip de persoană.
avertismente de serializare Java
există unele avertismente care privesc serializarea în Java.
3. 1. Moștenire și compoziție
când o clasă implementează interfața java.io.Serializable, toate sub-clasele sale sunt serializabile, de asemenea., Dimpotrivă, atunci când un obiect are o referinta catre un alt obiect, aceste obiecte trebuie să implementeze interfata Serializable separat, sau altcineva o NotSerializableException va fi aruncat:
public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}
Dacă unul dintre domeniile în serializable obiect constă dintr-o serie de obiecte, atunci toate aceste obiecte trebuie să fie serializabile la fel de bine, sau o NotSerializableException va fi aruncat.
3. 2. Versiunea serială UID
JVM asociază un număr de versiune (lung) cu fiecare clasă serializabilă., Este folosit pentru a verifica dacă obiectele salvate și încărcate au aceleași atribute și astfel sunt compatibile cu serializarea.acest număr poate fi generat automat de majoritatea IDE-urilor și se bazează pe numele clasei, atributele sale și modificatorii de acces asociați. Orice modificare are ca rezultat un număr diferit și poate provoca o InvalidClassException.
dacă o clasă serializable nu declară un serialVersionUID, JVM va genera unul automat la run-time., Cu toate acestea, este foarte recomandat ca fiecare clasă să-și declare serialVersionUID, deoarece cea generată este dependentă de compilator și, astfel, poate duce la InvalidClassExceptions neașteptate.
3. 3. Serializare particularizată în Java
Java specifică un mod implicit în care obiectele pot fi serializate. Clasele Java pot înlocui acest comportament implicit. Serializarea personalizată poate fi deosebit de utilă atunci când încercați să serializați un obiect care are anumite atribute neserializabile., Acest lucru poate fi realizat prin furnizarea de două metode în clasa pe care vrem să serialize:
private void writeObject(ObjectOutputStream out) throws IOException;
și
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
Cu aceste metode, putem serializa cei unserializable atribute în alte forme care pot fi serializate:
public class Address { private int houseNumber; // setters and getters}
următoarele unitate de testare testele de acest obicei serialization:
În acest cod, vom vedea cum pentru a salva unele unserializable atribute prin serializarea Adresa cu custom serialization. Rețineți că trebuie să marcăm atributele neserializabile ca tranzitorii pentru a evita NotSerializableException.,
concluzie
în acest tutorial rapid, am revizuit serializarea Java, am discutat lucruri importante de reținut și am arătat cum se face serializarea personalizată.