Serialization
at
SerialVersionUID
palaging 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
SerialVersionUID
sa aking
Serializable
-klase?
Bukod 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
Customer
uri
SerialVersionUID
na mahaba " Sa artikulong ito, hindi mo lamang matututunan ang mga pangunahing kaalaman ng Java
SerialVersionUID
kundi pati na rin ang epekto nito sa proseso ng serialization at de-serialization. Kapag nagdeklara ka ng klase, tulad
Serializable
ng 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,
SerialVersionUID
walang tugma, lalabas ang proseso nang may pagbubukod
InvalidClassException
sa 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
SerialVersionUID
at tukuyin ito bilang isang uri ng pare-pareho
private
static
final
long
sa iyong klase. Sa artikulong ito, malalaman natin ang tungkol sa kung bakit dapat nating gamitin
SerialVersionUID
ang 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
SerialVersionUID
tulad ng
static
final
long
sa 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,
SerialVersionUID
na 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
SerialVersionUID
sa 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
SerialVersionUID
para 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
SerialVersionUID
mga 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
serialver
upang bumuo
SerialVersionUID
para sa mga klase. Ito ay lalong kapaki-pakinabang para sa pagbuo ng mga klase; ang utility ay nagbabalik
SerialVersionUID
sa isang madaling kopyahin na format. Maaari mong gamitin ang
serialver
JDK 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
serialver
bilang
GUI
isang command
$ serialver –show
, ito ay magbubukas ng isang inspektor
serial version
na kumukuha ng buong pangalan ng klase at ipinapakita ito
Serial version
.
Buod
Ngayon alam na natin kung ano ito
SerialVersionUID
at kung bakit mahalagang ideklara ito sa isang
Serializable
-class, oras na para suriin ang ilang mahahalagang katotohanang nauugnay sa Java SerialVersionUID.
SerialVersionUID
ginamit upang ipahiwatig ang bersyon ng serialized na data.
- Kapag hindi namin idineklara
SerialVersionUID
sa 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.
- 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.
- 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
.
- 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
SerialVersionUID
sa Java. Ngayon alam na natin kung bakit mahalagang magdeklara ng tama
SerialVersionUID
sa 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
GO TO FULL VERSION