JavaRush /Java Blog /Random-TL /Nangungunang 13 tanong tungkol sa serialization sa mga pa...
Dmitry Vasilyev
Antas
Саратов

Nangungunang 13 tanong tungkol sa serialization sa mga panayam

Nai-publish sa grupo
Pagsasalin ng artikulong https://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html Ano ang serialization sa Java? Ang serialization ay isa sa mga mahahalagang konsepto na medyo bihirang gamitin bilang isang solusyon upang i-save ang estado ng mga programa at samakatuwid ang API na ito ay madalas na hindi pinapansin ng mga developer. Gayunpaman, sa aking karanasan, ang serialization ay isang medyo mahalagang paksa sa anumang pangunahing panayam sa Java. Halos bawat panayam na nakatagpo ko ay may isa o dalawang tanong tungkol sa serialization, at nakita ko ang mga kandidato na hindi komportable tungkol sa kanilang kakulangan ng karanasan sa lugar na ito pagkatapos ng ilang tanong sa paksang ito. Hindi nila alam kung paano i-serialize ang isang bagay sa Java, hindi sila pamilyar sa anumang mga halimbawa ng serialization at hindi maipaliwanag ang mga mekanika ng trabaho nito, ang pagkakaiba sa pagitan ng isang lumilipas at isang pabagu-bagong variable, hindi nila alam kung gaano karaming mga pamamaraan ang Serializable interface may. Ano ang interface ng marker? Ano ang layunin nito? Ano ang pagkakaiba sa pagitan ng Externalizable at Serializable na pagpapatupad sa Java? Bakit hindi pinalitan ng java ang Serializable ng @Serializable pagkatapos ipakilala ang anotasyon? Sa artikulong ito, tatalakayin namin ang mga tanong para sa mga baguhan at advanced na developer, na maaaring maging kapaki-pakinabang para sa lahat: mula sa mga junior hanggang sa mga senior developer. Karamihan sa mga komersyal na proyekto ay gumagamit ng alinman sa mga database, memory-mapped na mga file , o simpleng flat file lamang upang magbigay ng higit na tibay, ngunit kakaunti ang umaasa sa proseso ng serialization ng Java. Sa anumang kaso, ang post na ito ay hindi isang tutorial - ito ay tungkol sa mga tanong na nagkakahalaga ng paglilinaw para sa iyong sarili bago pumunta sa anumang panayam sa Java at mabigla sa mga terminong hindi mo alam. Para sa mga hindi pamilyar sa Java serialization: "Ang serialization sa Java ay isang proseso na ginagamit upang gawing serialize ang isang object sa Java sa pamamagitan ng pag-iimbak ng estado ng object sa isang file na may extension na .ser at muling paggawa ng estado ng object mula sa file na ito. Ang reverse process na ito ay tinatawag na deserialization. sepulka Ang Java Serialization API ay nagbibigay sa mga developer ng karaniwang mekanismo para sa pagse-serialize ng mga bagay gamit ang Serializable at Externalizable na mga interface. Sa pamamagitan ng paraan, ang artikulong ito ay isang pagpapatuloy ng aking ( hindi sa akin, ang tagasalin, ngunit ang may-akda ng orihinal na Ingles) na mga nakaraang artikulo: 20 mga tanong sa pakikipanayam sa mga pattern ng disenyo at 10 mga tanong sa pakikipanayam sa pattern ng Singleton sa Java . Kaya, tayo na! Ano ang serialization sa Java? Ang Object serialization sa Java ay isang prosesong ginagamit upang i-convert ang isang object sa isang binary na format na maaaring i-save sa disk o ipadala sa network sa anumang iba pang tumatakbong Java virtual machine; ang baligtad na proseso ng paglikha ng isang bagay mula sa isang binary stream ay tinatawag na deserialization. Nagbibigay ang Java ng API na kinabibilangan ng java.io.Serializable, java.io.Externalizable, ObjectInputStream at ObjectOutputStream atbp. Libre ang mga programmer na gamitin ang default na mekanismo ng serialization na ginagamit ng Java batay sa istruktura ng klase, ngunit maaari din nilang gamitin ang sarili nilang custom na binary format, na kadalasang inirerekomenda bilang pinakamahusay na kasanayan sa serialization dahil ang serialized binary na format ay nagiging bahagi ng na-export na API ng klase at posibleng masira ang encapsulation sa Java na ibinigay ng pribado at package-private na mga field. Sa pangkalahatan, ang impormasyong ito ay magiging sapat na upang makapagsimula. Paano gawing serializable ang isang klase ng Java? Ito ay napakadali. Kailangan lang ipatupad ng iyong klase ang java.io.Serializable interface at ang JVM na ang bahala sa pagse-serialize ng object sa isang default na format. Ang desisyon na gumawa ng isang serializable na klase ay dapat gawin sa madaling sabi dahil, bagama't ang mga panandaliang gastos sa paggawa ng isang serializable na klase ay mababa, ang mga pangmatagalang gastos ay malaki at maaaring potensyal na limitahan ang iyong kakayahang gumawa ng karagdagang mga pagbabago sa pagpapatupad. Nangyayari ito dahil, tulad ng anumang pampublikong API, ang serialized na anyo ng isang bagay ay nagiging bahagi ng pampublikong API, at kapag binago mo ang istraktura ng iyong klase sa pamamagitan ng pagpapatupad ng add interface, ang pagdaragdag o pag-alis ng anumang field ay maaaring potensyal na masira ang default na serialization. Gayunpaman, maaari itong mabawasan sa pamamagitan ng paggamit ng custom na binary na format, ngunit nangangailangan pa rin ito ng maraming pagsisikap upang matiyak ang pabalik na pagkakatugma. Ang isang halimbawa ng kung paano malilimitahan ng serialization ang iyong kakayahang baguhin ang isang klase ay ang SerialVersionUID field. Kung hindi mo tahasang idineklara ang SerialVersionUID, bubuo ito ng virtual machine batay sa istruktura ng klase, na nakadepende sa mga interface na ipinatupad ng klase at ilang iba pang salik na maaaring baguhin. Sabihin nating nagpapatupad ka ng ibang interface kumpara sa JVM, na bubuo ng ibang SerialVersionUID para sa bagong bersyon ng mga file ng klase, at kapag sinubukan mong mag-load ng lumang bagay na na-serialize ng lumang bersyon ng iyong program, makakakuha ka ng InvalidClassException. Tanong 1) Ano ang pagkakaiba sa pagitan ng Serializable at Externalizable na interface sa Java? Ito ang pinakamadalas itanong sa Java serialization interview na tanong. Ang Externalizable interface ay nagbibigay sa amin ng writeExternal() at readExternal() na mga pamamaraan, na nagbibigay sa amin ng flexibility na kontrolin ang serialization sa halip na umasa sa default na mekanismo. Ang wastong pagpapatupad ng Externalizable na interface ay maaaring makabuluhang mapabuti ang pagganap ng application. Tanong 2) Ilang mga pamamaraan ang mayroon ang Serializable? Kung walang paraan, ano ang layunin ng Serializable interface? Ang serializable na interface ay umiiral sa java.io package at bumubuo sa core ng serialization engine ng Java. Wala itong anumang mga pamamaraan at tinatawag ding marker interface sa Java. Kapag ipinatupad ng iyong klase ang java.io.Serializable na interface, nagiging serializable ito. Simple lang. Tanong 3) Ano ang serialVersionUID? Ano ang mangyayari kung hindi mo ito tinukoy? Isa sa aking mga paboritong tanong sa panayam ng serialization ng Java. Ang SerialVersionUID ay isang identifier na inilalagay sa isang object kapag ito ay serialized, kadalasan ay isang hash code ng object. Maaari mong gamitin ang serialver tool upang makuha ang serialVersionUID ng serialized object. SerialVersionUID ay ginagamit para sa object version control. Maaari mo ring tukuyin ang serialVersionUID sa iyong class file nang manu-mano. Ang kinahinatnan ng hindi pagtukoy ng serialVersionUID ay kung magdaragdag ka o magpalit ng anumang field sa isang klase, ang naka-serialized na klase ay hindi na makakabawi dahil ang serialVersionUID na nabuo para sa bagong klase ay magiging iba sa parehong field ng lumang serialized na object. Ang proseso ng serialization ng Java ay umaasa sa tamang serialVersionUID upang maibalik ang estado ng serialized na bagay at maghagis ng java.io.InvalidClassException kung mayroong mismatch. Upang matuto nang higit pa tungkol sa serialversionuid, tingnan dito . Tanong 4) Kapag nagse-serye, gusto mo bang hindi ma-serialize ang ilang miyembro? Paano ito makakamit? Isa pang madalas itanong sa serialization interview na tanong. Minsan nagtatanong din ang mga tao kung paano ginagamit ang isang transient variable, kung ang isang transient at isang static na variable ay serialized o hindi, atbp., kaya kung ayaw mong maging bahagi ng estado ng object ang anumang field, ideklara ito bilang static o transient depende sa iyong mga pangangailangan, at hindi ito isasama sa proseso ng serialization ng Java. Tanong 5) Ano ang mangyayari kung ang isa sa mga miyembro ng klase ay hindi nagpapatupad ng Serializable na interface? Isa sa mga simpleng tanong tungkol sa proseso ng serialization sa Java. Kung susubukan mong i-serialize ang isang object ng isang klase na nagpapatupad ng Serializable, ngunit ang object ay may kasamang reference sa isang klase na hindi Serializable, kung gayon ang isang NotSerializableException ay itatapon sa runtime, at iyon ang dahilan kung bakit palagi akong naglalagay ng SerializableAlert (seksyon ng mga komento sa aking code), isa sa mga pinakamahusay na diskarte sa pagkomento ng code ay upang turuan ang developer na tandaan ang katotohanang ito kapag nagdaragdag ng bagong field sa Serializable na klase. Tanong 6) Kung ang isang klase ay serializable ngunit ang superclass nito ay hindi, ano ang magiging estado ng mga variable ng instance na minana mula sa superclass pagkatapos ng deserialization? Ang proseso ng serialization ng Java ay nagpapatuloy lamang sa object hierarchy hangga't ang klase ay nagpapatupad ng Serializable interface at ang mga value ng mga variable na minana mula sa superclass ay masisimulan sa pamamagitan ng pagtawag sa non-serializable superclass's constructor sa panahon ng proseso ng deserialization. Kapag nagsimula na ang chain ng constructor, walang paraan para pigilan ito, kaya kahit na mas mataas ang mga klase sa hierarchy (huwag) ipatupad ang Serializable interface , ipapatupad ang constructor. Ang serialization interview na tanong na ito ay maaaring mukhang napakahirap, ngunit kung pamilyar ka sa mga pangunahing konsepto, hindi ito magiging mahirap. Tanong 7) Maaari mo bang i-customize ang proseso ng serialization o i-override ang default na proseso ng serialization sa Java? Ang sagot ay oo, kaya mo. Alam nating lahat na para i-serialize ang isang object, tinatawag ang ObjectOutputStream.writeObject(saveThisObject) at para magbasa ng object, tinatawag ang ObjectInputStream.readObject(), ngunit may isa pang bagay na ibinibigay sa iyo ng Java Virtual Machine - ang pagtukoy sa dalawang pamamaraang ito. sa iyong klase. Kung tutukuyin mo ang mga ito sa iyong klase, tatawagin ng JVM ang dalawang pamamaraang ito sa halip na gamitin ang default na mekanismo ng serialization. Dito maaari mong i-configure ang serialization at deserialization na gawi ng object sa pamamagitan ng pagsasagawa ng anumang preprocessing o postprocessing na gawain. Mahalagang tandaan na ang mga pamamaraang ito ay dapat na pribado upang maiwasan ang mana, overriding, o overloading. Dahil ang Java Virtual Machine lang ang maaaring tumawag sa isang pribadong paraan, ang integridad ng iyong klase ay mapangalagaan at ang serialization ay gagana gaya ng dati. Sa aking opinyon, ito ay isa sa mga pinakamahusay na katanungan na maaaring itanong sa anumang panayam sa Java Serialization. Ang isang magandang follow-up na tanong ay: bakit kailangan mong magbigay ng custom na serialized na form para sa iyong object? Tanong 8) Ipagpalagay na ang superclass ng isang bagong klase ay nagpapatupad ng Serializable interface, paano natin maiiwasan ang pagse-serialize ng bagong klase? Isa sa mga mahirap na tanong sa pakikipanayam sa Serialization sa Java. Kung ang superclass ng isang klase ay nagpapatupad na ng Serializable interface sa Java, ang descendant class ay Serializable din, dahil hindi mo maipapatupad ang interface ng magulang, at hindi talaga posible na gawin itong Non Serializable na klase. Gayunpaman, mayroong isang paraan upang maiwasan ang serialization para sa bagong klase na ito. Upang gawin ito, kailangan mong ipatupad ang writeObject() at readObject() na mga pamamaraan at itapon ang NotSerializableException mula sa mga pamamaraang ito. Karaniwang itinatanong ang tanong na ito bilang karagdagang tanong habang nagpapatuloy ang panayam. Tanong 9) Ano ang mga pamamaraan na ginamit sa proseso ng serialization at deserialization sa Java? Ito ay isang napaka-karaniwang tanong sa serialization. Ano ang sinusubukang malaman ng tagapanayam sa kasong ito? Pamilyar ka man sa paggamit ng readObject(), writeObject(), readExternal() at writeExternal() o hindi. Ang serialization ng Java ay ginagawa ng java.io.ObjectOutputStream na klase. Ang klase na ito ay isang na-filter na stream na nakabalot sa isang mas mababang antas ng byte stream upang pangasiwaan ang serialization engine. Upang i-save ang anumang bagay gamit ang mekanismo ng serialization, tinatawagan namin ang ObjectOutputStream.writeObject(saveThisObject) at para i-deserialize ang object na iyon, tinatawag namin ang ObjectInputStream.readObject() method. Ang pagtawag sa writeObject() na paraan ay magsisimula sa proseso ng serialization. Isang mahalagang bagay na dapat tandaan tungkol sa readObject() na paraan ay ginagamit ito upang magbasa ng mga byte at upang lumikha at magbalik ng isang bagay mula sa mga byte na iyon, na dapat naman ay i-cast sa tamang uri. Tanong 10) Ipagpalagay na mayroon kang isang klase na iyong na-serialize at na-save, at pagkatapos ay binago mo ang klase na iyon upang magdagdag ng isang bagong field. Ano ang mangyayari kung deserialize mo ang isang naka-serialized na bagay? Depende ito sa kung ang klase ay may sariling serialVersionUID o wala. Tulad ng alam namin mula sa mga tanong sa itaas, kung hindi kami magbibigay ng serialVersionUID sa aming code, bubuo ito mismo ng java compiler at kadalasan ito ay magiging katumbas ng hash code ng bagay na iyon. Pagkatapos magdagdag ng anumang bagong field, may pagkakataon na ang bagong serialVersionUID na nabuo para sa bersyon na iyon ng klase ay hindi tumugma sa naka-serialized na object, kung saan ang API ay magtapon ng java.io.InvalidClassException. Para sa kadahilanang ito, inirerekomenda na magkaroon ng sarili mong serialVersionUID sa iyong code, na palaging pareho para sa parehong klase. Tanong 11) Ano ang mga tugma at hindi magkatugma na mga pagbabago sa mekanismo ng serialization ng Java? Ang tunay na problema ay ang pagbabago ng istraktura ng mga klase sa pamamagitan ng pagdaragdag ng anumang field, pamamaraan o pag-alis ng anumang field o pamamaraan na may naka-serialized na bagay. Ayon sa detalye ng Java Serialization, ang pagdaragdag ng anumang field o pamamaraan ay nasa ilalim ng katugmang pagbabago at pagbabago. class hierarchy o UN-implementing Serializable interface na ang ilan ay nasa ilalim ng mga hindi katugmang pagbabago). Para sa kumpletong listahan ng mga tugma at hindi tugmang pagbabago, iminumungkahi kong basahin ang Java Serialization Specification. Tanong 12) Maaari ba kaming maglipat ng isang serialized na bagay sa network? Oo, maaari kang magpasa ng isang serialized na bagay sa network dahil ang isang Java serialized object ay isang koleksyon ng mga byte na maaaring maipasa sa anumang paraan. Maaari mo ring iimbak ang serialized na bagay sa disk o sa isang database bilang isang Blob. Tanong 13) Anong mga uri ng mga variable ang hindi na-serialize sa panahon ng serialization ng Java? Minsan iba ang itinanong sa tanong na ito, ngunit pareho ang layunin: upang malaman kung alam ng developer ng Java ang mga detalye ng pagse-serialize ng mga static at transient variable. Dahil ang mga static na variable ay nabibilang sa isang klase at hindi isang object, hindi sila bahagi ng estado ng object, kaya hindi sila nagpapatuloy sa proseso ng serialization ng Java. Dahil ang Java serialization ay nag-iimbak lamang ng estado ng isang bagay at hindi ang mismong bagay, ang mga lumilipas na variable ay hindi rin kasama sa proseso ng serialization at hindi bahagi ng serialized na estado ng object. Pagkatapos ng tanong na ito, marahil ay magtatanong ang tagapanayam: Kung hindi mo iniimbak ang mga halaga ng mga variable na ito, ano ang magiging halaga ng mga variable na ito pagkatapos ng deserializing at muling paglikha ng bagay na ito? At ito, mga kasamahan, isipin mo ang iyong sarili :) Ang orihinal na artikulo ay narito .
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION