JavaRush /Java Blog /Random-TL /Bakit gagamit ng SerialVersionUID sa loob ng Serializable...
0xFF
Antas
Донецк

Bakit gagamit ng SerialVersionUID sa loob ng Serializable na klase sa Java

Nai-publish sa grupo
Serializationat SerialVersionUIDpalaging nananatiling misteryo sa maraming developer ng Java. Madalas akong makakita ng mga tanong tungkol sa kung ano ang SerialVersionUID, o ano ang mangyayari kung hindi ako magdedeklara SerialVersionUIDsa aking Serializable-klase? Bakit gagamit ng SerialVersionUID sa loob ng Serializable na klase sa Java - 1Bukod sa nakakalito at madalang gamitin, ang isa pang dahilan para sa tanong na ito ay ang nawawalang babala ng Eclipse IDE SerialVersionUID, halimbawa: " Ang Serializable class na Customer ay hindi nagdedeklara ng static na final SerialVersionUID fieldSerializable na may Customeruri SerialVersionUIDna mahaba " Sa artikulong ito, hindi mo lamang matututunan ang mga pangunahing kaalaman ng Java SerialVersionUIDkundi pati na rin ang epekto nito sa proseso ng serialization at de-serialization. Kapag nagdeklara ka ng klase, tulad Serializableng pagpapatupad ng token interface java.io.Serializable, ang Java runtime ay nag-iimbak ng isang instance ng klase na iyon sa disk gamit ang default na mekanismo ng serialization maliban kung i-configure mo ang proseso para gamitin ang Externalizable interface . Sa panahon ng serialization, ang Java runtime ay gumagawa ng numero ng bersyon para sa klase upang ito ay ma-deserialize sa ibang pagkakataon. Sa Java, ang numero ng bersyon na ito ay kilala bilang SerialVersionUID. Kung, sa panahon ng deserialization, SerialVersionUIDwalang tugma, lalabas ang proseso nang may pagbubukod InvalidClassExceptionsa stream na " main" java.io.InvalidClassException, at ipi-print din ang pangalan ng klase at ang kaukulang SerialVersionUID. Ang isang mabilis na solusyon upang ayusin ang problemang ito ay ang kopyahin SerialVersionUIDat tukuyin ito bilang isang uri ng pare-pareho private static final longsa iyong klase. Sa artikulong ito, malalaman natin ang tungkol sa kung bakit dapat nating gamitin SerialVersionUIDang Java at kung paano gamitin ang serialver JDK tool upang mabuo ang ID na ito. Kung bago ka sa serialization, maaari mo ring panoorin ang Top 10 Java Serialization Interview Questions para masuri ang iyong kaalaman at makahanap ng mga puwang sa iyong pang-unawa para sa karagdagang pagbabasa. Tulad ng Concurrency(concurrency) at Multi-threading(multithreading), Serialization(serialization) ay isa pang paksa na karapat-dapat basahin nang ilang beses.

Bakit gagamit ng SerialVersionUID sa Java

Tulad ng sinabi ko, kapag hindi namin tinukoy ang isang halaga SerialVersionUIDtulad ng static final longsa aming klase, ang mekanismo ng serialization ang gagawa nito para sa amin. Ang mekanismong ito ay sensitibo sa maraming detalye, kabilang ang mga field ng iyong klase, ang kanilang mga access modifier, ang mga interface na ipinapatupad nito, at maging ang iba't ibang mga pagpapatupad ng compiler; anumang mga pagbabago sa klase o paggamit ng ibang compiler ay maaaring magbunga ng ibang resulta, SerialVersionUIDna sa huli ay pigilan ang pag-reload ng serialized na data. Mapanganib na umasa sa mekanismo ng serialization ng Java upang mabuo ang id na ito, kaya naman magandang ideya na tahasang tukuyin ito SerialVersionUIDsa iyong Serializable na klase . Lubos kong inirerekumenda ang pagbabasa ng Java classic - Joshua Bloch "Effective Java" upang maunawaan ang Java serialization at ang mga problema sa paghawak sa mga ito nang hindi tama. Sa pamamagitan ng paraan, ang JDK ay nagbibigay din ng isang tool serialver, na matatagpuan sa direktoryo ng bin ng direktoryo ng JAVA_HOME , sa aking computer, C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , na maaaring magamit upang bumuo SerialVersionUIDpara sa mga lumang klase. Ito ay lubhang kapaki-pakinabang kung sakaling gumawa ka ng mga pagbabago sa iyong klase na masira ang serialization at ang iyong application ay hindi makapag-reload ng mga serialized na pagkakataon. Madali mong magagamit ang utility na ito upang lumikha ng SerialVersionUIDmga lumang instance, at pagkatapos ay gamitin ito nang tahasan sa pamamagitan ng pagdedeklara sa field bilang pribadong static final long SerialVersionUID . Sa pamamagitan ng paraan, lubos na inirerekomenda para sa pagganap at mga kadahilanang pangseguridad na gamitin ang regular na binary na format para sa serialization; muli, ang "Effective Java" ay may ilang mga talata na nagpapakita ng mga bentahe ng regular na format sa mahusay na detalye.

Paano gamitin ang serialver JDK utility para makabuo ng SerialVersionUID

Maaari mong gamitin serialverupang bumuo SerialVersionUIDpara sa mga klase. Ito ay lalong kapaki-pakinabang para sa pagbuo ng mga klase; ang utility ay nagbabalik SerialVersionUIDsa isang madaling kopyahin na format. Maaari mong gamitin ang serialverJDK utility tulad ng ipinapakita sa halimbawa:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Maaari mo ring gamitin ang utility serialverbilang GUIisang command $ serialver –show, ito ay magbubukas ng isang inspektor serial versionna kumukuha ng buong pangalan ng klase at ipinapakita ito Serial version.

Buod

Ngayon alam na natin kung ano ito SerialVersionUIDat kung bakit mahalagang ideklara ito sa isang Serializable-class, oras na para suriin ang ilang mahahalagang katotohanang nauugnay sa Java SerialVersionUID.
  1. SerialVersionUIDginamit upang ipahiwatig ang bersyon ng serialized na data.

  2. Kapag hindi namin idineklara SerialVersionUIDsa aming klase, ginagawa ito ng Java runtime para sa amin, ngunit ang prosesong ito ay sensitibo sa maraming metadata ng klase kabilang ang bilang ng mga field, uri ng mga field, field access modifier, mga interface na ipinapatupad sa klase , atbp. Mahahanap mo ang eksaktong impormasyon sa dokumentasyon ng Serialization mula sa Oracle.

  3. Inirerekomenda na ideklara ang SerialVersionUID bilang isang pribadong static na final long variable upang maiwasan ang default na mekanismo. Ang ilang mga IDE, gaya ng Eclipse , ay naglalabas din ng mga babala kung nakalimutan mo ito, halimbawa: "Ang Serializable class na Customer ay hindi nagdedeklara ng isang static na final na SerialVersionUID na field na may haba." . Bagama't maaari mong hindi paganahin ang babalang ito sa pamamagitan ng pagpunta sa Window > Preferences > Java > Compiler > Errors/Warnings > Potensyal na Problema sa Programming, iminumungkahi kong huwag gawin ito. Kapag hindi kinakailangan ang pagbawi ng data, maaari akong maging pabaya tungkol dito. Narito kung ano ang hitsura ng error na ito sa Eclipse IDE, ang kailangan mo lang gawin ay gawin ang unang mabilis na desisyon. Bakit gagamit ng SerialVersionUID sa loob ng Serializable na klase sa Java - 2

  4. Maaari mo ring gamitin ang serialver utility mula sa JDK upang bumuo ng Serial na Bersyon para sa mga klase sa Java. Ang utility ay mayroon ding GUI, na pinagana kapag ipinapasa ang - parameter show.

  5. Ang pinakamahusay na kasanayan sa serialization ay ang tahasang pagdedeklara SerialVersionUID, upang maiwasan ang anumang mga problema sa de-serialization, lalo na kung nagtatrabaho ka sa isang client-server application na umaasa sa serialized na data, gaya ng RMI.
Ito ay tungkol SerialVersionUIDsa Java. Ngayon alam na natin kung bakit mahalagang magdeklara ng tama SerialVersionUIDsa klase. Maaari mong pasalamatan ang iyong IDE para sa paalala na ito, na maaaring masira ang de-serialization ng iyong klase. Kung gusto mong magbasa nang higit pa tungkol sa serialization at mga nauugnay na konsepto, maaari mo ring tingnan ang mga kahanga-hangang artikulong ito. Original dito
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION