Articles

cum se întâmplă procesul de deserializare în Java?

Posted by admin

Într-una din postul meu anterior legat de „punere în Aplicare interfata Serializable în java”, Domnul Bitoo pus o întrebare bună „la data de deserializtion, cum JVM creează obiect fără a apela constructorul??”. M-am gândit să-i răspund în același post într-un comentariu, dar într-un alt moment m-am gândit la acest subiect foarte interesant, care necesită un articol detaliat separat, precum și discuții cu voi., Așadar, aici încep discuția cu cunoștințele mele limitate în acest subiect și vă voi încuraja pe toți să vă puneți gândurile/întrebările, astfel încât acest subiect să fie clar pentru noi toți. Aici încep.

am acoperit deja multe lucruri legate de serializare în java, și unele lucruri legate de deserializare în java, de asemenea. Nu voi reitera din nou același lucru și voi ajunge direct la subiectul principal de discuție, adică cum funcționează deserializarea în Java?deserializarea este procesul prin care obiectul serializat anterior este reconstruit înapoi în forma sa originală, adică., instanță obiect. Intrarea în procesul de deserializare este fluxul de octeți pe care îl trecem peste celălalt capăt al rețelei sau pur și simplu îl citim din sistemul de fișiere/baza de date. O întrebare apare imediat, ce este scris în interiorul acestui flux de octeți?

Citeste Mai mult: Mini-ghid pentru punerea în aplicare interfata serializable

Pentru a fi foarte precis, acest flux de octeți (sau spun serializat de date) are toate informațiile cu privire la instanță, care a fost serializat prin procesul de serializare., Aceste informații includ datele meta ale clasei, informațiile de tip ale câmpurilor de instanță și valorile câmpurilor de instanță. Aceleași informații sunt necesare atunci când obiectul este reconstruit înapoi la o nouă instanță obiect. În timp ce deserializing un obiect, JVM citește metadatele sale de clasă din fluxul de octeți care specifică dacă clasa unui obiect implementează fie „Serializable” sau „Externalizable” interfață.,

vă rugăm să rețineți că pentru deserializarea să se întâmple perfect, bytecode de o clasă, al cărui obiect este deserializat, trebuie să fie prezent în JVM efectuarea deserializare. În caz contrar, „ClassNotFoundException” este aruncat. Nu e prea evident ??

dacă instance implementează interfața serializabilă, atunci o instanță a clasei este creată fără a invoca vreun constructor. Serios? atunci cum este creat obiectul dacă nu este numit constructor?

Să ne uităm la bytecode de un simplu eprogram:

de mai Sus bytecode arata lucruri reale, nu-i așa?, În prima noastră linie, vom împinge o valoare din „tabelul variabilelor locale” pe stivă. În acest caz, suntem într-adevăr doar împingând referința implicită la „acest”, astfel încât nu este instrucțiunea cea mai interesantă. A doua instrucțiune este principalul lucru. Se invocă de fapt constructorul de super-cele mai multe clase și în cazul de mai sus este obiect.java. Și odată ce constructorul super most class (adică obiect în acest caz) a fost numit, restul codului face instrucțiuni specifice scrise în cod.

potrivire la conceptul de mai sus, adică., constructor de super cele mai multe clase, avem un concept similar în deserializare. În procesul de deserializare, este necesar ca toate clasele părinte de instanță ar trebui să fie Serializable; și dacă orice super-clasă în hirarchy nu este Serializable atunci trebuie să aibă un constructor implicit. Acum are sens. Deci, în timp ce deserializarea super – cea mai mare clasă este căutată mai întâi până când se găsește orice clasă non-serializabilă. Dacă toate clasele super sunt serializabile, atunci JVM ajunge la clasa obiect în sine și creează mai întâi o instanță a clasei obiect., Dacă între căutarea claselor super, orice clasă este găsită non-serializabilă, atunci constructorul implicit va fi folosit pentru a aloca o instanță în memorie.

dacă orice super – clasă de instanță să fie de-serialized în non-serializable și, de asemenea, nu are un constructor implicit atunci „NotSerializableException” este aruncat de JVM.

De asemenea, înainte de a continua cu reconstrucția obiectului, JVM verifică dacă serialVersionUID menționat în fluxul de octeți se potrivește cu serialVersionUID din clasa acelui obiect. Dacă nu se potrivește ,atunci „InvalidClassException” este aruncat.,

Citeste Mai mult: SerialVersionUID în java și legate de fapte rapide

Deci, pana acum avem exemplu află în memorie utilizând una din superclasa este constructorul implicit. Rețineți că, după aceasta, Niciun constructor nu va fi chemat pentru nicio clasă. După executarea constructor super-clasă, JVM citit fluxul de octet și de a folosi meta date instanță pentru a seta informații de tip și alte informații meta de instanță.,

după ce instanța necompletată este creată, JVM a setat mai întâi câmpurile statice și apoi invocă metoda implicită readObject() intern, care este responsabilă pentru setarea valorilor din fluxul de octeți în instanța necompletată.

Citeste Mai mult: Exemplu de cod pentru readObject() și writeObject()

După readObject() metoda este finalizată, deserializarea procesul este terminat și sunteți gata să lucreze cu noi deserialized exemplu.

Leave A Comment