SerialVersionUID යනු කුමක්ද සහ මා එය භාවිතා කළ යුත්තේ ඇයි?


3006

serialVersionUIDඅස්ථානගත වූ විට සූර්යග්‍රහණය අනතුරු ඇඟවීම් නිකුත් කරයි .

අනුක්‍රමික පන්තියේ ෆූ විසින් ස්ථිතික අවසාන අනුක්‍රමික වර්ෂන් යූඅයිඩී ක්ෂේත්‍රය දිගු ලෙස ප්‍රකාශ නොකරයි

serialVersionUIDඑය වැදගත් වන්නේ කුමක්ද සහ ඇයි? නැතිවීම serialVersionUIDගැටළුවක් ඇති කරන උදාහරණයක් කරුණාකර පෙන්වන්න .


1
SerialversionUID ගැන හොඳ පුහුණුවක් සොයා ගන්න; dzone.com/articles/what-is-serialversionuid
ceyun

Answers:


2296

සඳහා වන ලියකියවිලි java.io.Serializableඔබට ලැබෙන තරමට හොඳ පැහැදිලි කිරීමක් විය හැකිය:

අනුක්‍රමික ධාවන කාල වේලාවන් එක් එක් අනුක්‍රමික පන්තිය සමඟ සම්බන්ධ වන අනුවාද අංකයක් ලෙස හැඳින්වේ serialVersionUID, එය අනුක්‍රමිකකරණය අතරතුරදී භාවිතා කරනුයේ අනුක්‍රමික වස්තුවක් යවන්නා සහ ලබන්නා විසින් අනුක්‍රමිකකරණයට අනුකූල වන වස්තුව සඳහා පන්ති පටවා ඇති බව තහවුරු කර ගැනීම සඳහා ය. serialVersionUIDඅනුරූප යවන්නාගේ පන්තියට වඩා වෙනස් වූ වස්තුව සඳහා ග්‍රාහකයා පන්තියක් පටවා ඇත්නම් , ඩෙසරීකරණය කිරීමෙන් ප්‍රති a ල ලැබෙනු ඇත InvalidClassException. ස්ථිතික, අවසාන සහ වර්ගය විය යුතු serialVersionUIDනම් serialVersionUIDකළ ක්ෂේත්‍රයක් ප්‍රකාශ කිරීමෙන් අනුක්‍රමික පන්තියකට තමන්ගේම ප්‍රකාශයක් කළ හැකිය long:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

අනුක්‍රමික පන්තියක් a නිශ්චිතව ප්‍රකාශ නොකරන්නේ නම් serialVersionUID, serialVersionUIDජාවා (ටීඑම්) වස්තු අනුක්‍රමිකකරණ පිරිවිතරයේ විස්තර කර ඇති පරිදි, අනුක්‍රමික ධාවන කාලය පන්තියේ විවිධ පැතිකඩ මත පදනම්ව එම පන්තියේ පෙරනිමි අගය ගණනය කරනු ඇත . කෙසේ වෙතත්, පෙරනිමි ගණනය කිරීම සම්පාදක ක්‍රියාවට නැංවීම මත පදනම්ව වෙනස් විය හැකි පන්ති විස්තර වලට අතිශයින් සංවේදී බැවින්, අනුක්‍රමිකකරණය කළ හැකි සෑම පන්තියක්ම පැහැදිලිවම අගයන් ප්‍රකාශ කිරීම තරයේ නිර්දේශ කෙරේ . එබැවින්, විවිධ ජාවා සම්පාදක ක්‍රියාත්මක කිරීම් හරහා ස්ථාවර අගයක් සහතික කිරීම සඳහා, අනුක්‍රමික පන්තියක් පැහැදිලි අගයක් ප්‍රකාශ කළ යුතුය . එම පැහැදිලි බව ද තරයේ අවවාද කරනු ලැබේserialVersionUIDserialVersionUIDInvalidClassExceptionsserialVersionUIDserialVersionUIDserialVersionUIDප්‍රකාශයන් හැකි සෑම අවස්ථාවකදීම පුද්ගලික විකරණකාරකය භාවිතා කරයි, මන්ද එවැනි ප්‍රකාශයන් අදාළ වන්නේ ක්ෂණිකව ප්‍රකාශ කරන පන්ති serialVersionUIDක්ෂේත්‍රයන්ට පමණක් වන බැවින් උරුම වූ සාමාජිකයන් ලෙස ප්‍රයෝජනවත් නොවේ.


327
ඉතින්, ඔබ මූලිකවම කියන්නේ, පරිශීලකයාට ඉහත සඳහන් සියලු කරුණු අවබෝධ වී නොතිබුනේ නම්, පරිශීලකයා අනුක්‍රමිකකරණය ගැන කරදර නොවිය යුතු යැයි කීවාද? මම විශ්වාස කරනවා ඔබ "කොහොමද?" "ඇයි?" පැහැදිලි කිරීමට වඩා. SerializableVersionUID සමඟ මා කරදර වන්නේ මන්දැයි මට එකකට තේරෙන්නේ නැත.
සිගි

367
දෙවන ඡේදයේ ඇත්තේ ඇයි: ඔබ පැහැදිලිවම SerialVersionUID නිශ්චිතව දක්වා නොමැති නම්, අගයක් ස්වයංක්‍රීයව ජනනය වේ - නමුත් එය අස්ථාවර වන්නේ එය සම්පාදක ක්‍රියාත්මක කිරීම මත රඳා පවතින බැවිනි.
ජෝන් ස්කීට්

14
සූර්යග්‍රහණය මට "පුද්ගලික ස්ථිතික අවසාන දිගු අනුක්‍රමය VersionUID = 1L" අවශ්‍ය යැයි පවසන්නේ ඇයි? මම ව්‍යතිරේක පන්තිය දීර් extend කරන විට?
JohnMerlino

21
@JohnMerlino: හොඳයි මම එය ඔබ කියන්න අපේක්ෂා නොකරන බවත් අවශ්ය එක් - නමුත් එය කළ හැකිය යෝජනා ඔබ නිවැරදිව ව්යතිරේක serialize උදව් කිරීම සඳහා එක්. ඔබ ඒවා අනුක්‍රමික කිරීමට යන්නේ නැත්නම්, ඔබට නියතය අවශ්‍ය නොවේ.
ජෝන් ස්කීට්

16
@ ජෝන් මර්ලිනෝ, ඔබගෙන් කොටසක් ප්‍රශ්න කිරීමට හේතුව: ව්‍යතිරේකය මඟින් අනුක්‍රමික කළ හැකි සහ සූර්යග්‍රහණය අනතුරු අඟවන්නේ ඔබ අනුක්‍රමික අනුවාදයක් සකසා නොමැති බවයි, එය හොඳ අදහසක් වනු ඇත (ඔබ පන්තිය අනුක්‍රමික කිරීමට අකමැති නම්) ජෝන්ස්කීට්ගේ පෝස්ට් දළ සටහන්.
zpon

476

ඔබ ක්රියාත්මක කිරීම උදෙසා serialize ඇති පමණින් serializing කරන්නේ (ඔබ සඳහා serialize නම් කරන සැලකිලිමත් වෙනවා නම් HTTPSession, නිදසුනක් ලෙස ... එය ගබඩා කර හෝ නොවේ නම්,, ඔබට මීට ගැන තැකීමක් කරන්නේ නෑ de-serializingපෝරමයක් වස්තුව), එසේ නම් ඔබට හැකි මෙය නොසලකා හරින්න.

ඔබ සැබවින්ම අනුක්‍රමිකකරණය භාවිතා කරන්නේ නම්, එය වැදගත් වන්නේ ඔබ සෘජුවම අනුක්‍රමිකකරණය භාවිතා කරමින් වස්තු ගබඩා කර නැවත ලබා ගැනීමට සැලසුම් කරන්නේ නම් පමණි. මෙම serialVersionUIDඔබේ පන්තියේ අනුවාදය නියෝජනය කරන අතර, ඔබේ පන්තියේ වත්මන් අනුවාදය එහි පෙර අනුවාදය හා සමග ආපස්සට අනුකූල නොවේ නම් ඔබට එය වර්ධකය යුතුය.

බොහෝ විට, ඔබ බොහෝ විට අනුක්‍රමිකකරණය සෘජුවම භාවිතා නොකරනු ඇත. තත්වය මෙය නම්, SerialVersionUIDඉක්මන් නිවැරදි කිරීමේ විකල්පය ක්ලික් කිරීමෙන් පෙරනිමියක් ජනනය කරන්න, ඒ ගැන කරදර නොවන්න.


78
මම කියන්නේ ඔබ ස්ථිර ගබඩා කිරීම සඳහා අනුක්‍රමිකකරණය භාවිතා නොකරන්නේ නම්, ඔබ වටිනාකමක් එකතු කරනවාට වඩා uppSuppressWarnings භාවිතා කළ යුතු බවයි. එය පංතිය අඩුවෙන් අවුල් කරන අතර, නොගැලපෙන වෙනස්කම් වලින් ඔබව ආරක්ෂා කිරීම සඳහා අනුක්‍රමික වර්ෂන් යූඅයිඩී යාන්ත්‍රණයේ අශිෂ් ity ත්වය ආරක්ෂා කරයි.
ටොම් ඇන්ඩර්සන්

25
තවත් පේළියකට (අනුක්‍රමික හැඳුනුම්පතට) වඩා එක් පේළියක් (uppSppressWarnings annotation) එකතු කරන්නේ කෙසේදැයි මම නොදනිමි. ස්ථිර ගබඩා කිරීම සඳහා ඔබ අනුක්‍රමිකකරණය භාවිතා නොකරන්නේ නම්, ඔබ "1" භාවිතා නොකරන්නේ ඇයි? කෙසේ වෙතත් ස්වයංක්‍රීය උත්පාදක හැඳුනුම්පත ගැන ඔබ තැකීමක් නොකරයි.
MetroidFan2002

71
@ MetroidFan2002: මම හිතන්නේ @ ටොම් ඇන්ඩර්සන් serialVersionUIDනොගැලපෙන වෙනස්කම් වලින් ඔබව ආරක්ෂා කිරීමේ කාරණය වලංගු වේ. @SuppressWarningsස්ථිර ගබඩා කිරීම සඳහා පංතිය භාවිතා කිරීමට ඔබ අකමැති නම් ලේඛන භාවිතා කිරීම වඩා හොඳය.
අබ්දුල්ලා සී

11
"ඔබේ පන්තියේ වර්තමාන අනුවාදය එහි පෙර අනුවාදය සමඟ පසුපසට නොගැලපේ නම් ඔබ එය වැඩි කළ යුතුය:" ඔබ පළමුව අනුක්‍රමිකකරණයේ පුළුල් වස්තු අනුවාදකරණ සහාය ගවේෂණය කළ යුතුය, (අ) පංතිය සැබවින්ම දැන් අනුක්‍රමිකකරණයට නොගැලපෙන ආකාරයක් බව සහතික කිරීම සඳහා, පිරිවිතරයන්ට අනුව එය සාක්ෂාත් කර ගැනීම තරමක් අපහසු ය; (ආ) ධාරාව අනුකූලව පවතින බව තහවුරු කර ගැනීම සඳහා අභිරුචි කියවීම / ලිවීම විෂය () ක්‍රම, කියවීම නැවත සකස් කිරීම / ලිවීම () ක්‍රම, අනුක්‍රමික කළ හැකි ක්ෂේත්‍ර ප්‍රකාශ ආදිය වැනි යෝජනා ක්‍රමයක් උත්සාහ කිරීම. සත්‍යය වෙනස් කිරීම serialVersionUIDඅවසාන පියවරකි, බලාපොරොත්තු සුන්වීමකි.
මාර්ක්විස් ඔෆ් ලෝර්න්

4
පංතියේ ආරම්භක කතුවරයා පැහැදිලිව හඳුන්වා දුන් විට JEJP serialVersionUID හි වැඩිවීම පින්තූරයට පැමිණේ. මම කියන්නේ jvm ජනනය කළ අනුක්‍රමික හැඳුනුම්පත හොඳින් විය යුතු බවයි. අනුක්‍රමිකකරණය පිළිබඳව මා දුටු හොඳම පිළිතුර මෙයයි .
overexchange

307

ජොෂ් බ්ලොච්ගේ ective ලදායී ජාවා (2 වන සංස්කරණය) පොත ඇතුළත් කිරීමට මට මෙය අවස්ථාවක් කර ගත නොහැක . 11 වන පරිච්ඡේදය ජාවා අනුක්‍රමිකකරණය පිළිබඳ අත්‍යවශ්‍ය සම්පතකි.

ජොෂ් අනුව, ස්වයංක්‍රීයව ජනනය කරන ලද UID ජනනය කරනු ලබන්නේ පන්ති නාමයක්, ක්‍රියාත්මක කළ අතුරුමුහුණත් සහ සියලු පොදු සහ ආරක්ෂිත සාමාජිකයන් මත ය. මේවායින් ඕනෑම ආකාරයකින් වෙනස් කිරීම serialVersionUID. එබැවින් ඔබට ඔවුන් සමඟ පටලවා ගැනීමට අවශ්‍ය නොවන්නේ පංතියේ එක් අනුවාදයකට වඩා කිසි විටෙකත් අනුක්‍රමික නොවන බව ඔබට විශ්වාස නම් (ක්‍රියාවලීන් හරහා හෝ පසු කාලීනව ගබඩාවෙන් ලබා ගත හැක).

ඔබ දැන් ඔවුන් නොසලකා හරින, ඔබ යම් ආකාරයකින් පන්ති වෙනස් නමුත් පන්තියේ ගැළපුම w / පැරණි අනුවාදය පවත්වා ගැනීමට අවශ්ය බව පසුව සොයා නම්, ඔබ JDK මෙවලමක් භාවිතා කළ හැකිය serialver ජනනය සඳහා serialVersionUIDමත පැරණි පන්තිය, එලිපිට දුරුකර නව පන්තියේ. (ඔබගේ වෙනස්වීම් මත පදනම්ව එකතු කිරීම් writeObjectසහ readObjectක්‍රම මඟින් අභිරුචි අනුක්‍රමිකකරණය ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය විය හැකිය - Serializableජාවාඩොක් හෝ ඉහත සඳහන් 11 වන පරිච්ඡේදය බලන්න.)


33
පංතියක අනුකූලතාව w / පැරණි අනුවාදයන් ගැන යමෙකු සැලකිලිමත් වන්නේ නම් යමෙකුට SerializableVersionUID සමඟ කරදර විය හැකිද?
සිගි

10
ඔව්, නවතම අනුවාදය කිසියම් මහජන සාමාජිකයෙකු ආරක්‍ෂිත ලෙස වෙනස් කරන්නේ නම්, පෙරනිමි SerializableVersionUID වෙනස් වන අතර එය වලංගු නොවන පන්තියේ එක්සෙප්ෂන් මතු කරයි.
චන්දර් ශිවදාසානි

3
පන්තියේ නම, ක්‍රියාත්මක කළ අතුරුමුහුණත්, සියලුම පොදු සහ ආරක්ෂිත ක්‍රම, සියලු උදාහරණ විචල්‍යයන්.
Achow

31
සෑම අනුක්‍රමික පන්තියකටම යූඩ් අනුක්‍රමික අනුවාදය සඳහන් කිරීම වටී යැයි යෝෂුවා බ්ලොච් උපදෙස් දෙන බව සඳහන් කිරීම වටී. 11 වන පරිච්ඡේදයෙන් උපුටා ගැනීම: ඔබ තෝරාගත් අනුක්‍රමික ආකෘතිය කුමක් වුවත්, ඔබ ලියන සෑම අනුක්‍රමික පන්තියකම පැහැදිලි අනුක්‍රමික අනුවාදයක් UID ප්‍රකාශ කරන්න. මෙය නොගැලපීමේ විභව ප්‍රභවයක් ලෙස UID අනුක්‍රමික අනුවාදය ඉවත් කරයි (අයිතමය 74). කුඩා කාර්ය සාධන ප්‍රතිලාභයක් ද ඇත. UID අනුක්‍රමික අනුවාදයක් සපයා නොමැති නම්, ධාවන වේලාවේදී එකක් ජනනය කිරීම සඳහා මිල අධික ගණනය කිරීමක් අවශ්‍ය වේ.
අසුතෝෂ් ජින්ඩාල්

135

මෙම අනුක්‍රමික අනුවාදය අවවාද නොසලකා හැරීමට ඔබට සූර්යග්‍රහණයට පැවසිය හැකිය:

කවුළුව> මනාප> ජාවා> සම්පාදක> දෝෂ / අනතුරු ඇඟවීම්> විභව ක්‍රමලේඛන ගැටළු

ඔබ නොදැන සිටියේ නම්, මෙම කොටසේ ඔබට සක්‍රිය කළ හැකි වෙනත් අනතුරු ඇඟවීම් රාශියක් ඇත (හෝ සමහරක් දෝෂ ලෙස වාර්තා වී ඇත), බොහෝ ඒවා ඉතා ප්‍රයෝජනවත් වේ:

  • විභව ක්‍රමලේඛන ගැටලු: අහම්බෙන් සිදුවිය හැකි බූලියන් පැවරුම
  • විභව ක්‍රමලේඛන ගැටළු: ශුන්‍ය දර්ශක ප්‍රවේශය
  • අනවශ්‍ය කේතය: දේශීය විචල්‍යය කිසි විටෙක කියවන්නේ නැත
  • අනවශ්‍ය කේතය: අතිරික්ත ශුන්‍ය පරීක්ෂාව
  • අනවශ්‍ය කේතය: අනවශ්‍ය වාත්තු කිරීම හෝ 'instanceof'

සහ තවත් බොහෝ දේ.


21
upvote නමුත් මුල් පෝස්ටරය කිසිවක් අනුක්‍රමික කරන බවක් නොපෙනෙන නිසා පමණි. පෝස්ටරයේ "මම මේ කාරණය අනුක්‍රමික කරමින් සිටිමි ..." යනුවෙන් පැවසුවහොත් ඔබට ඒ වෙනුවට ඡන්දයක් ලැබෙනු ඇත: පී
ජෝන් ගාඩ්නර්

3
ඇත්ත - මම උපකල්පනය කළේ ප්‍රශ්න
කරන්නාට

14
@ ගාඩ්නර් -> එකඟ විය! නමුත් ප්‍රශ්න කරන්නාට අවවාද කිරීමට අවශ්‍ය නොවන්නේ මන්දැයි දැන ගැනීමටද අවශ්‍යය.
සිගි

8
ප්‍රශ්න කරන්නා පැහැදිලිවම සැලකිලිමත් වන්නේ UID එකක් තිබිය යුත්තේ මන්ද යන්නයි. එබැවින් අනතුරු ඇඟවීම නොසලකා හරින ලෙස ඔහුට පැවසීම පහත් කොට දැක්විය යුතුය.
cinqS

111

serialVersionUIDඅනුක්‍රමික දත්ත සංස්කරණය කිරීමට පහසුකම් සපයයි. අනුක්‍රමික කිරීමේදී එහි වටිනාකම දත්ත සමඟ ගබඩා වේ. අනුක්‍රමිකකරණය කරන විට, අනුක්‍රමික දත්ත වත්මන් කේතයට ගැලපෙන්නේ කෙසේදැයි බැලීමට එකම අනුවාදය පරීක්ෂා කරනු ලැබේ.

ඔබට ඔබේ දත්ත සංස්කරණය කිරීමට අවශ්‍ය නම්, ඔබ සාමාන්‍යයෙන් serialVersionUID0 න් ආරම්භ කර, ඔබේ පන්තියේ සෑම ව්‍යුහාත්මක වෙනසක් සමඟම එය අනුක්‍රමික දත්ත වෙනස් කරයි (අස්ථිර නොවන ක්ෂේත්‍ර එකතු කිරීම හෝ ඉවත් කිරීම).

ගොඩනංවන ලද අනුක්‍රමිකකරණ යාන්ත්‍රණය ( in.defaultReadObject()) දත්තවල පැරණි අනුවාද වලින් අනුක්‍රමිකකරණය ප්‍රතික්ෂේප කරනු ඇත. නමුත් ඔබට අවශ්‍ය නම් පැරණි දත්ත නැවත කියවිය හැකි ඔබේම කියවීමේ වස්තුව () ක්‍රියාකාරීත්වය අර්ථ දැක්විය හැකිය . මෙම අභිරුචි කේතයට පසුව දත්ත පරීක්ෂා serialVersionUIDකරන්නේ කුමන අනුවාදයේ දැයි දැන ගැනීමට සහ එය අනුක්‍රමික කරන්නේ කෙසේදැයි තීරණය කිරීමට හැකිය. ඔබේ කේතයේ අනුවාද කිහිපයක් නොනැසී පවතින අනුක්‍රමික දත්ත ගබඩා කරන්නේ නම් මෙම අනුවාදකරණ තාක්ෂණය ප්‍රයෝජනවත් වේ.

නමුත් මෙතරම් දීර් sp කාලයක් සඳහා අනුක්‍රමික දත්ත ගබඩා කිරීම එතරම් සුලභ නොවේ. උදාහරණයක් ලෙස හැඹිලියක් සඳහා දත්ත තාවකාලිකව ලිවීමට හෝ කේත පදනමේ අදාළ කොටස්වල එකම අනුවාදය සහිත වෙනත් වැඩසටහනකට ජාලය හරහා යැවීමට අනුක්‍රමිකකරණ යාන්ත්‍රණය භාවිතා කිරීම වඩාත් සුලභ ය.

මෙම අවස්ථාවේ දී ඔබ පසුගාමී අනුකූලතාව පවත්වා ගැනීමට උනන්දු නොවේ. ඔබ සැලකිලිමත් වන්නේ සන්නිවේදනය කරන කේත පදනම් සැබවින්ම අදාළ පංතිවල එකම අනුවාදයන් ඇති බවට වග බලා ගැනීම සඳහා පමණි. එවැනි චෙක්පතක් සඳහා පහසුකම් සැලසීම සඳහා, ඔබ serialVersionUIDපෙර මෙන් නඩත්තු කළ යුතු අතර ඔබේ පන්තිවල වෙනස්කම් සිදු කරන විට එය යාවත්කාලීන කිරීමට අමතක නොකරන්න.

ක්ෂේත්‍රය යාවත්කාලීන කිරීමට ඔබට අමතක වුවහොත්, ඔබට විවිධ ව්‍යුහයන් සහිත නමුත් එකම පන්තියක වෙනස් අනුවාද දෙකකින් අවසන් විය හැකිය serialVersionUID . මෙය සිදුවුවහොත්, පෙරනිමි යාන්ත්‍රණය ( in.defaultReadObject()) කිසිදු වෙනසක් හඳුනා නොගන්නා අතර නොගැලපෙන දත්ත අනුක්‍රමික කිරීමට උත්සාහ කරයි. දැන් ඔබට ගුප්ත ධාවන කාල දෝෂයක් හෝ නිහ silent අසමත් වීමක් (ශුන්‍ය ක්ෂේත්‍ර) සමඟ අවසන් විය හැකිය. මෙම වර්ගයේ දෝෂ සොයා ගැනීම දුෂ්කර විය හැකිය.

එබැවින් මෙම භාවිතයට උදව් කිරීම සඳහා, ජාවා වේදිකාව මඟින් සැකසීම් නොකිරීමේ තේරීමක් ලබා දේ serialVersionUID අතින් . ඒ වෙනුවට, පන්ති ව්‍යුහයේ හැෂ් එකක් සම්පාදනය කරන වේලාවේදී ජනනය කර හැඳුනුම්පතක් ලෙස භාවිතා කරනු ඇත. මෙම යාන්ත්‍රණය මඟින් ඔබට කිසි විටෙකත් එකම හැඳුනුම්පතක් සහිත විවිධ පන්ති ව්‍යුහයන් නොමැති බවට වග බලා ගත හැකි අතර, එම නිසා ඉහත සඳහන් කළ ධාවන කාල අනුක්‍රමිකකරණ අසමත්වීම් ඔබට නොලැබෙනු ඇත.

නමුත් ස්වයංක්‍රීයව ජනනය කරන ලද හැඳුනුම් ක්‍රමෝපායට පිටුපස පැත්තක් තිබේ. එකම පන්තිය සඳහා ජනනය කරන ලද අයිඩී සම්පාදකයින් අතර වෙනස් විය හැකිය (ඉහත ජෝන් ස්කීට් සඳහන් කළ පරිදි). එබැවින් ඔබ විවිධ සම්පාදකයින් සමඟ සම්පාදනය කරන ලද කේත අතර අනුක්‍රමික දත්ත සන්නිවේදනය කරන්නේ නම්, කෙසේ හෝ අයිඩී අතින් නඩත්තු කිරීම රෙකමදාරු කරනු ලැබේ.

ඔබ සඳහන් කළ පළමු භාවිතයේ දී මෙන් ඔබේ දත්ත සමඟ පසුපසට අනුකූල නම්, ඔබටත් හැඳුනුම්පත පවත්වා ගැනීමට අවශ්‍ය වනු ඇත. මෙය කියවිය හැකි අයිඩී ලබා ගැනීම සඳහා සහ ඒවා වෙනස් වන විට සහ කෙසේද යන්න පිළිබඳ වැඩි පාලනයක් ඇති කිරීම සඳහා ය.


4
අස්ථිර නොවන ක්ෂේත්‍ර එකතු කිරීම හෝ ඉවත් කිරීම පන්ති අනුක්‍රමිකකරණය-නොගැලපේ. එබැවින් එවැනි වෙනස්කම් මත 'එය ගැසීමට' හේතුවක් නැත.
මාර්ක්විස් ඔෆ් ලෝර්න්

4
@ ඊ.ජේ.පී: හහ්? දත්ත එකතු කිරීම නිසැකවම මගේ ලෝකයේ අනුක්‍රමික දත්ත වෙනස් කරයි.
ඇලෙක්සැන්ඩර් ටෝස්ට්ලිං

3
Lex ඇලෙක්සැන්ඩර් ටෝර්ස්ට්ලිං මම ලියූ දේ කියවන්න. මම කිව්වේ නැහැ එය 'අනුක්‍රමික දත්ත වෙනස් කරන්නේ නැහැ' කියලා. මම කිව්වා එය 'පන්ති අනුක්‍රමිකකරණයට නොගැලපේ' කියලා. එය එකම දෙයක් නොවේ. ඔබ වස්තු අනුක්‍රමිකකරණ පිරිවිතරයේ අනුවාද පරිච්ඡේදය කියවිය යුතුය.
මාක්විස් ඔෆ් ලෝර්න්

3
J ඊ.ජේ.පී: අස්ථිර නොවන ක්ෂේත්‍රයක් එක් කිරීම අනිවාර්යයෙන්ම ඔබ පන්ති අනුක්‍රමිකකරණයට නොගැළපෙන බවක් අදහස් නොකරන බව මම තේරුම් ගතිමි, නමුත් එය ව්‍යුහාත්මක වෙනසක් වන අතර එය අනුක්‍රමික දත්ත වෙනස් කරන අතර සාමාන්‍යයෙන් ඔබ එසේ නොකරන්නේ නම් අනුවාදය ඉහළට ඔසවා තැබිය යුතුය. පසුපසට ගැළපුම හසුරුවන්න, මම පසුව ලිපියෙන් විස්තර කළෙමි. ඔබේ අදහස හරියටම කුමක්ද?
ඇලෙක්සැන්ඩර් ටෝස්ට්ලිං

4
මගේ අදහස හරියටම මම කී දේම පවතී. අස්ථිර නොවන ක්ෂේත්‍ර එකතු කිරීම හෝ ඉවත් කිරීම මඟින් පන්තියේ අනුක්‍රමිකකරණය-නොගැලපේ. එබැවින් ඔබ එසේ කරන සෑම අවස්ථාවකම SerialVersionUID එක ගැසීමට අවශ්‍ය නොවේ.
මාක්විස් ඔෆ් ලෝර්න්

72

SerialVersionUID යනු කුමක්ද සහ මා එය භාවිතා කළ යුත්තේ ඇයි?

SerialVersionUID යනු එක් එක් පන්තිය සඳහා අද්විතීය හඳුනාගැනීමක්, JVM වන අතර, පන්තියේ අනුවාදයන් සංසන්දනය කිරීම සඳහා එය භාවිතා කරන්නේ අනුක්‍රමිකකරණයේදී එකම පන්තිය භාවිතා කර ඇති බව සහතික කරමිනි.

එකක් නියම කිරීමෙන් වැඩි පාලනයක් ලැබෙනු ඇත, නමුත් ඔබ සඳහන් නොකරන්නේ නම් ජේවීඑම් එකක් ජනනය කරයි. ජනනය කරන ලද අගය විවිධ සම්පාදකයින් අතර වෙනස් විය හැකිය. තවද, සමහර විට ඔබට කිසියම් හේතුවක් නිසා පැරණි අනුක්‍රමික වස්තූන් අවලංගු කිරීම තහනම් කිරීමට අවශ්‍ය වන backward incompatibilityඅතර, මේ අවස්ථාවේ දී ඔබට සිදුවන්නේ අනුක්‍රමික VersionUID වෙනස් කිරීමයි.

මෙම සඳහා javadocsSerializable මතය :

පෙරනිමි අනුක්‍රමික VersionUID ගණනය කිරීම සම්පාදක ක්‍රියාත්මක කිරීම් මත පදනම්ව වෙනස් විය හැකි පන්ති විස්තර වලට බෙහෙවින් සංවේදී වන අතර එමඟින් ඩෙසරීකරණය InvalidClassExceptionඅතරතුර අනපේක්ෂිත ලෙස සිදුවිය හැකිය.

එමනිසා, ඔබ අපට වැඩි පාලනයක් ලබා දෙන බැවින් ඔබ අනුක්‍රමික අනුවාදය ප්‍රකාශයට පත් කළ යුතුය .

මෙම ලිපියේ මාතෘකාව පිළිබඳ හොඳ කරුණු කිහිපයක් තිබේ.


3
In විනෝත්බාබු නමුත් serialVersionUID ස්ථිතික බැවින් ස්ථිතික විචල්‍යයන් අනුක්‍රමික කළ නොහැක. එසේ නම්, jvm අනුවාදය පරික්ෂා කරන්නේ කෙසේද, අපරීක්ෂාකාරී වස්තුවේ අනුවාදය කුමක්දැයි නොදැන
Kranthi Sama

3
මෙම පිළිතුරේ සඳහන් නොවන එක් දෙයක් නම්, serialVersionUIDඒ ඇයි දැයි නොදැන අන්ධව ඇතුළත් කිරීමෙන් ඔබ බලාපොරොත්තු නොවූ ප්‍රතිවිපාක ඇති කළ හැකි බවයි . මෙට්‍රොයිඩ් ෆෑන් 2002 හි පිළිතුර ගැන ටොම් ඇන්ඩර්සන් කළ ප්‍රකාශය මෙයට ආමන්ත්‍රණය කරයි: “මම කියන්නේ ඔබ ස්ථිර ගබඩා කිරීම සඳහා අනුක්‍රමිකකරණය භාවිතා නොකරන්නේ නම්, ඔබ වටිනාකමක් එකතු කරනවාට වඩා upp සුප්‍රස් වෝර්නින්ස් භාවිතා කළ යුතු බවයි. නොගැලපෙන වෙනස්කම් වලින් ඔබව ආරක්ෂා කිරීමට serialVersionUID යාන්ත්‍රණය.
කිරිබි

7
serialVersionUIDනොවන වන 'එක් එක් පන්තිය සඳහා අනුපම අනන්යකාරකය. සම්පුර්ණ සුදුසුකම් ලත් පන්තියේ නම එයයි. එය අනුවාද දර්ශකයකි.
ලෝර්න් හි මාක්විස්

58

මුල් ප්‍රශ්නය 'එය වැදගත් වන්නේ ඇයි' සහ 'උදාහරණය' Serial Version IDඉල්ලා ඇත. හොඳයි, මම එකක් සොයා ගත්තා.

ඔබ Carපන්තියක් සාදන්න , එය ක්ෂණිකව සකසා වස්තු ප්‍රවාහයකට ලියන්න. සමතලා කර ඇති කාර් වස්තුව ගොනු පද්ධතිය තුළ යම් කාලයක් වාඩි වී සිටී. මේ අතර, Carනව ක්ෂේත්‍රයක් එකතු කිරීමෙන් පන්තිය වෙනස් කරන්නේ නම්. පසුකාලීනව, ඔබ සමතලා කර ඇති එනම් ) කියවීමට උත්සාහ කරන විට (එනම් ඩෙසරිලයිස්Car වස්තුව , ඔබට ලැබෙනුයේjava.io.InvalidClassException - අනුක්‍රමික කළ හැකි සියලුම පන්තිවලට ස්වයංක්‍රීයව අද්විතීය හඳුනාගැනීමක් ලබා දෙන බැවිනි. පංතියේ අනන්‍යතාවය පැතලි වස්තුව හඳුනාගැනීමට සමාන නොවන විට මෙම ව්‍යතිරේකය විසි කරනු ලැබේ. ඔබ ඒ ගැන සැබවින්ම සිතන්නේ නම්, නව ක්ෂේත්‍රය එකතු කිරීම නිසා ව්‍යතිරේකය විසි වේ. පැහැදිලි අනුක්‍රමික අනුවාදයක් ප්‍රකාශයට පත් කිරීමෙන් අනුවාදය ඔබම පාලනය කිරීමෙන් ඔබට මෙම ව්‍යතිරේකය වළක්වා ගත හැකිය. ඔබේ දේ පැහැදිලිව ප්‍රකාශ කිරීමේදී කුඩා කාර්ය සාධන ප්‍රතිලාභයක් ද ඇතserialVersionUID(ගණනය කළ යුතු නැති නිසා). එබැවින්, පහත දැක්වෙන පරිදි ඔබ ඒවා නිර්මාණය කළ විගසම ඔබේ අනුක්‍රමික පන්ති වලට ඔබේම අනුක්‍රමික අනුවාදය එකතු කිරීම වඩාත් සුදුසුය:

public class Car {
    static final long serialVersionUID = 1L; //assign a long value
}

සෑම යූඅයිඩී එකකටම 1L නොව අහඹු දිගු අංකයක් ලබා දිය යුතුය.
අබ්බාස්

4
අබ්බාස් 'යමෙක්' එසේ කළ යුත්තේ ඇයි? කරුණාකර එහි ඇති වෙනස පැහැදිලි කරන්න.
මාර්ක්විස් ඔෆ් ලෝර්න්

නම පවසන පරිදි, එය නිරූපණය කරන්නේ වස්තුව අනුක්‍රමික කිරීමට භාවිතා කළ පන්තියේ අනුවාදයයි. ඔබ සෑම විටම එකම අංකයක් ලබා දෙන්නේ නම්, එය අනුක්‍රමික කිරීමට සුදුසු පංතිය සොයා ගැනීමට ඔබට නොහැකි වනු ඇත. එබැවින් ඔබ පන්තියේ වෙනසක් සිදු කරන සෑම අවස්ථාවකම අනුවාදය වෙනස් කිරීම වඩා හොඳය.
අබ්බාස්

2
අබ්බාස්, මෙම අභිප්‍රාය ස්වාභාවික සංඛ්‍යා වැඩි කිරීම 1සහ යනාදිය සමඟ ගැටෙන්නේ නැත .
වඩ්සිම්

2
Ill බිල්ක්, මම සිතුවේ අනුක්‍රමිකකරණ පරීක්ෂාව පන්තියේ නම සහ අනුක්‍රමික අනුවාදය යූඅයිඩී සමඟ බැඳී ඇති බවයි. එබැවින් විවිධ පංතිවල සහ පුස්තකාලවල විවිධ අංකකරණ යෝජනා ක්‍රමවලට කිසිදු ආකාරයකින් මැදිහත් විය නොහැක. නැතහොත් ඔබ කේත ජනනය කරන පුස්තකාල අදහස් කළාද?
වඩ්සිම්

44

පළමුව මට අනුක්‍රමිකකරණය යනු කුමක්දැයි පැහැදිලි කළ යුතුය.

අනුක්‍රමිකකරණය මඟින් වස්තුවක් ධාරාවකට පරිවර්තනය කිරීමට ඉඩ සලසයි, එම වස්තුව ජාලය හරහා යැවීම සඳහා හෝ ලිපිගොනු සුරැකීම හෝ ලිපිගොනු භාවිතය සඳහා ඩී.බී.

අනුක්‍රමිකකරණය සඳහා නීති කිහිපයක් තිබේ .

  • වස්තුවක් අනුක්‍රමික කළ හැක්කේ එහි පන්තිය හෝ එහි සුපිරි පන්තිය අනුක්‍රමික අතුරු මුහුණත ක්‍රියාත්මක කරන්නේ නම් පමණි

  • වස්තුවක් එහි සුපිරි පන්තිය නොවුනත්, අනුක්‍රමික කළ හැකි ය (අනුක්‍රමික අතුරු මුහුණත ක්‍රියාත්මක කරයි). කෙසේ වෙතත්, අනුක්‍රමික කළ හැකි අතුරුමුහුණත ක්‍රියාත්මක නොකරන, අනුක්‍රමික පන්තියේ ධූරාවලියෙහි පළමු සුපිරි පන්තියට, ආර්ග් රහිත ඉදිකිරීම්කරුවෙකු සිටිය යුතුය. මෙය උල්ලං is නය වී ඇත්නම්, කියවීමේ වස්තුව () ක්‍රියාත්මක වන විට java.io.InvalidClassException නිපදවයි

  • සියලුම ප්‍රාථමික වර්ග අනුක්‍රමික වේ.

  • අස්ථිර ක්ෂේත්‍ර (අස්ථිර විකරණකාරකය සමඟ) අනුක්‍රමික නොවේ, (එනම්, සුරකින ලද හෝ ප්‍රතිස්ථාපනය නොකළ). අනුක්‍රමිකකරණය ක්‍රියාත්මක කරන පන්තියක් අනුක්‍රමිකකරණයට සහය නොදක්වන පන්තිවල අස්ථිර ක්ෂේත්‍ර සලකුණු කළ යුතුය (උදා: ගොනු ප්‍රවාහයක්).

  • ස්ථිතික ක්ෂේත්‍ර (ස්ථිතික විකරණකාරකය සමඟ) අනුක්‍රමික නොවේ.

Objectඅනුක්‍රමිකකරණය කළ විට , ජාවා ධාවන වේලාව අනුක්‍රමික අනුවාද අංක aka සමඟ සම්බන්ධ කරයි serialVersionID.

අපට SerialVersionID අවශ්‍ය තැන: යවන්නා සහ ලබන්නා අනුක්‍රමිකකරණයට අනුකූලද යන්න තහවුරු කර ගැනීම සඳහා ඩෙසරීකරණය අතරතුර. ග්‍රාහකයා වෙනත් ආකාරයකින් පන්තිය පටවා ඇත්නම්,serialVersionIDඩෙසරීකරණය අවසන් වනු ඇතInvalidClassCastException. ස්ථිතික, අවසාන සහ වර්ගයේ දිග විය යුතුනම්කළක්ෂේත්‍රයක් ප්‍රකාශ කිරීමෙන්
අනුක්‍රමික පන්තියකට තමන්ගේමserialVersionUIDප්‍රකාශයක්serialVersionUIDකළ හැකිය.

අපි මෙය උදාහරණයක් සමඟ උත්සාහ කරමු.

import java.io.Serializable;    
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String empname;
private byte empage;

public String getEmpName() {
    return name;
}
public void setEmpName(String empname) {
    this.empname = empname;
}
public byte getEmpAge() {
    return empage;
}
public void setEmpAge(byte empage) {
    this.empage = empage;
}

public String whoIsThis() {
    StringBuffer employee = new StringBuffer();
    employee.append(getEmpName()).append(" is ).append(getEmpAge()).append("
years old  "));
    return employee.toString();
}
}

අනුක්‍රමික වස්තුව සාදන්න

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Writer {
public static void main(String[] args) throws IOException {
    Employee employee = new Employee();
    employee.setEmpName("Jagdish");
    employee.setEmpAge((byte) 30);

    FileOutputStream fout = new 
FileOutputStream("/users/Jagdish.vala/employee.obj");
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(employee);
    oos.close();
    System.out.println("Process complete");
}
}

වස්තුව අවතක්සේරු කරන්න

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Reader {
public static void main(String[] args) throws ClassNotFoundException, 
IOException {
    Employee employee = new Employee();
    FileInputStream fin = new 
    FileInputStream("/users/Jagdish.vala/employee.obj");
    ObjectInputStream ois = new ObjectInputStream(fin);
    employee = (Employee) ois.readObject();
    ois.close();
    System.out.println(employee.whoIsThis());
 }
}    

සටහන: දැන් සේවක පන්තියේ අනුක්‍රමික අනුවාදය වෙනස් කර සුරකින්න:

private static final long serialVersionUID = 4L;

පා er ක පන්තිය ක්‍රියාත්මක කරන්න. ලේඛක පන්තිය ක්‍රියාත්මක කිරීමට නොවන අතර ඔබට ව්‍යතිරේකය ලැබෙනු ඇත.

Exception in thread "main" java.io.InvalidClassException: 
com.jagdish.vala.java.serialVersion.Employee; local class incompatible: 
stream classdesc serialVersionUID = 1, local class serialVersionUID = 4
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.krishantha.sample.java.serialVersion.Reader.main(Reader.java:14)

මා වැරදියි නම් මාව නිවැරදි කරන්න - ඔබ දැනට පන්තියේ ගමන් කරමින් සිටින / භාවිතා කරන දේශීය පන්තිය වන අතර වෙනත් පාර්ශවයක් විසින් භාවිතා කරනු ලබන ප්‍රවාහය (උදා: ඔබට පිළිතුරක් ලබා දෙන සේවාදායකයක් සහ අනුක්‍රමිකව ප්‍රතිචාරය). ඔබ තෙවන පාර්ශවීය ලිබ් යාවත්කාලීන කළ සේවාදායකයකු සමඟ සන්නිවේදනය කරන විට ඔබට මෙම තත්වයට මුහුණ දිය හැකිය, නමුත් ඔබ (සේවාදායකයා) මෙය සිදු කළේ නැත.
වික්ටර්

37

ඔබේ වස්තූන් බයිට් අරාව සඳහා අනුක්‍රමික කිරීමට සහ ඒවා යැවීමට / ගබඩා කිරීමට ඔබට කිසි විටෙකත් අවශ්‍ය නොවේ නම්, ඔබ ඒ ගැන කරදර විය යුතු නැත. ඔබ එසේ කරන්නේ නම්, ඔබ ඔබේ අනුක්‍රමික වර්ෂන් යූඅයිඩී සලකා බැලිය යුතුය. ජාවා භාෂා පිරිවිතරයෙන් ඒ ගැන වැඩිදුර කියවන්න.


10
ඔබ වස්තූන් අනුක්‍රමික කිරීමට යන්නේ නැත්නම්, ඒවා අනුක්‍රමික කළ හැක්කේ ඇයි?
එරික්සන්

7
@erickson - මව් පංතිය අනුක්‍රමික විය හැකිය, කියන්න, ArrayList, නමුත් ඔබට අවශ්‍ය වන්නේ ඔබේම වස්තුවක් (කියන්න, නවීකරණය කරන ලද අරා ලැයිස්තුවක්) එය පදනමක් ලෙස භාවිතා කිරීමට නමුත් ඔබ කිසි විටෙකත් ඔබ විසින් සාදන ලද එකතුව අනුක්‍රමික කිරීමට යන්නේ නැත.
MetroidFan2002

5
එය ජාවා භාෂා පිරිවිතරයේ කොතැනකවත් සඳහන් නොවේ. එය වස්තු අනුවාද පිරිවිතරයේ සඳහන් වේ.
ලෝර්න් හි මාක්විස්


34

පංතියකදී ඔබට මෙම අනතුරු ඇඟවීම ලැබුනේ නම්, ඔබ කිසි විටෙකත් අනුක්‍රමිකකරණය ගැන නොසිතන අතර ඔබ ඔබම ප්‍රකාශ නොකළේය implements Serializable බවත් නම්, බොහෝ විට එසේ වන්නේ ඔබ සුපිරි පන්තියකින් උරුම වූ නිසාය. බොහෝ විට උරුමය භාවිතා කිරීම වෙනුවට එවැනි වස්තුවකට පැවරීම වඩා හොඳය.

ඉතින්, ඒ වෙනුවට

public class MyExample extends ArrayList<String> {

    public MyExample() {
        super();
    }
    ...
}

කරන්න

public class MyExample {
    private List<String> myList;

    public MyExample() {
         this.myList = new ArrayList<String>();
    }
    ...
}

(හෝ ) myList.foo()වෙනුවට අදාළ ක්‍රම වලදී අමතන්න . (මෙය සෑම අවස්ථාවකම නොගැලපේ, නමුත් තවමත් බොහෝ විට.)this.foo()super.foo()

මම බොහෝ විට දකින්නේ මිනිසුන් ජේෆ්‍රේම් හෝ එවැනි අය දිගු කරන විට, ඔවුන්ට ඇත්ත වශයෙන්ම මේ සඳහා පැවරිය යුතු විට පමණි. (මෙය IDE එකක ස්වයංක්‍රීයව සම්පුර්ණ කිරීමටද උපකාරී වේ, JFrame ක්‍රම සිය ගණනක් ඇති බැවින්, ඔබේ අභිරුචි ඒවා ඔබේ පන්තියට කැඳවීමට අවශ්‍ය විට ඔබට අවශ්‍ය නොවේ.)

අනතුරු ඇඟවීම (හෝ serialVersionUID) වැළැක්විය නොහැකි එක් අවස්ථාවක් නම්, ඔබ සාමාන්‍යයෙන් නිර්නාමික පංතියක වියුක්ත ක්‍රියාවෙන් විහිදෙන විට, ක්‍රියාකාරී ක්‍රියාකාරී ක්‍රමය එකතු කිරීම පමණි. මෙම නඩුවේ අනතුරු ඇඟවීමක් නොතිබිය යුතු යැයි මම සිතමි (සාමාන්‍යයෙන් ඔබේ පංතියේ විවිධ අනුවාදයන් හරහා එවැනි නිර්නාමික පංති විශ්වාසදායක ලෙස අනුක්‍රමිකකරණය කිරීමට හා අවතක්සේරු කිරීමට ඔබට නොහැකි බැවින්), නමුත් සම්පාදකයාට මෙය හඳුනාගත හැක්කේ කෙසේදැයි මට විශ්වාස නැත.


4
මම හිතන්නේ ඔබ නිවැරදියි යන්න පිළිබඳ සංයුතිය වඩාත් අර්ථවත් කරයි, විශේෂයෙන් ඔබ අරේලිස්ට් වැනි පන්ති ගැන සාකච්ඡා කරන විට. කෙසේ වෙතත්, බොහෝ රාමු වලට මිනිසුන්ට අනුක්‍රමික කළ හැකි වියුක්ත සුපිරි පන්ති වලින් (ස්ට්රූට්ස් 1.2 හි ඇක්ෂන් ෆෝම් පන්තිය හෝ සැක්සන්ගේ විස්තාරණ ක්‍රියාකාරී නිර්වචනය වැනි) විහිදිය යුතු වේ. මම හිතන්නේ ඔබ නිවැරදියි, සමහර අවස්ථාවල අනතුරු ඇඟවීම නොසලකා
හැරියහොත් හොඳයි

2
නිසැකවම ඔබ පංතියක් සාමාජිකයෙකු ලෙස එකතු කරන්නේ නම්, එයින් උරුම වනවාට වඩා, ඔබ භාවිතා කිරීමට කැමති සාමාජික පංතියේ සෑම ක්‍රමයක් සඳහාම එතීමේ ක්‍රමයක් ලිවීමට සිදුවනු ඇත, එමඟින් විශාල අවස්ථාවන්හිදී එය කළ නොහැකි වනු ඇත .. ජාවා වලට පර්ල් වලට සමාන ශ්‍රිතයක් නොමැති නම් __AUTOLOAD, මම නොදනිමි.
එම්_එම්

4
_M_M: ඔබ ඔතා ඇති වස්තුවට ක්‍රම රාශියක් පවරන විට, ඇත්ත වශයෙන්ම නියෝජිත කණ්ඩායම භාවිතා කිරීම සුදුසු නොවේ. නමුත් මෙම නඩුව නිර්මාණ අත්වැරැද්දක ලකුණක් යැයි මම සිතමි - ඔබේ පන්තියේ පරිශීලකයින්ට (උදා: "MainGui") ඔතා ඇති වස්තුවේ (උදා: JFrame) බොහෝ ක්‍රම ඇමතීමට අවශ්‍ය නොවිය යුතුය.
Paŭlo Ebermann

1
නියෝජිත කණ්ඩායමට මා අකමැති දෙය නම් නියෝජිතයා වෙත යොමු කිරීමක් අවශ්‍ය වේ. සෑම සඳහනක්ම වැඩි මතකයක් අදහස් කරයි. මම වැරදියි නම් මාව නිවැරදි කරන්න. මට වස්තු 100 කින් යුත් අභිරුචි කළ අරා ලැයිස්තුවක් අවශ්‍ය නම් මෙය එතරම් වැදගත් නොවේ. නමුත් මට වස්තු කිහිපයක CustomizdeArrayLists සිය ගණනක් අවශ්‍ය නම් මතක භාවිතය සැලකිය යුතු ලෙස වැඩි වේ.
ඩබ්ලිව්.රොක්

2
විසි කිරීම අනුක්‍රමික කළ හැකි අතර විසි කළ හැකි දේ පමණක් විසි කළ හැකි බැවින් අනුක්‍රමික නොවන ව්‍යතිරේකයක් නිර්වචනය කළ නොහැක. පැවරීම කළ නොහැක.
ෆිල්

22

ක්ෂේත්‍ර අනුක්‍රමික VersionUID හි වැදගත්කම අවබෝධ කර ගැනීම සඳහා, අනුක්‍රමිකකරණය / Deserialization ක්‍රියාත්මක වන ආකාරය තේරුම් ගත යුතුය.

අනුක්‍රමික පන්ති වස්තුවක් අනුක්‍රමික කළ විට, ජාවා ධාවන කාලය මෙම අනුක්‍රමික වස්තුව සමඟ අංක (අනුක්‍රමික අනුවාදය යූඅයිඩී ලෙස හැඳින්වේ) අනුක්‍රමික අනුවාදයක් සම්බන්ධ කරයි. ඔබ මෙම අනුක්‍රමික වස්තුව අවලංගු කරන අවස්ථාවේදී, ජාවා ධාවන කාලය අනුක්‍රමික වස්තුවක අනුක්‍රමික අනුවාදය පන්තියේ අනුක්‍රමික අනුවාදය සමඟ ගැලපේ. දෙකම සමාන නම් එය තවදුරටත් ඉදිරියට යාමේ ක්‍රියාවලිය සමඟ ඉදිරියට යයි. වෙනත් අවලංගු ක්ලාස් එක්සෙෂන් විසි කරයි.

එබැවින් අපි අනුමාන කරන්නේ අනුක්‍රමිකකරණය / ආශ්‍රිතකරණ ක්‍රියාවලිය සාර්ථක කර ගැනීම සඳහා අනුක්‍රමික වස්තුවක අනුක්‍රමික අනුවාදය පන්තියේ අනුක්‍රමික අනුවාදයට සමාන විය යුතු බවයි. ක්‍රමලේඛකයා විසින් වැඩසටහනේ අනුක්‍රමික අනුවාදය පැහැදිලිව සඳහන් කරන්නේ නම්, එම අගයම අනුක්‍රමිකකරණය සහ ආශ්‍රිත වේදිකාව නොසලකා, අනුක්‍රමික වස්තුව හා පන්තිය සමඟ සම්බන්ධ වේ (උදා. සින්ග් ජේවීඑම් භාවිතා කරමින් එම්එස් ජේවීඑම් සහ ඩෙසරයිලේෂන් විවිධ වේදිකා ලිනක්ස් වල තිබිය හැක).

නමුත් ක්‍රමලේඛකයා විසින් serialVersionUID නිශ්චිතව දක්වා නොමැති නම්, කිසියම් වස්තුවක අනුක්‍රමිකකරණය DeSerialization කරන විට, ජාවා ධාවන කාලය ගණනය කිරීම සඳහා තමන්ගේම ඇල්ගොරිතම භාවිතා කරයි. මෙම අනුක්‍රමික VersionUID ගණනය කිරීමේ ඇල්ගොරිතම එක් JRE සිට තවත් JRE දක්වා වෙනස් වේ. වස්තුව අනුක්‍රමික කර ඇති පරිසරය එක් JRE (උදා: SUN JVM) භාවිතා කරන අතර ඩෙසරීකරණය සිදු වන පරිසරය ලිනක්ස් ජේවීඑම් (සින්ග්) භාවිතා කරයි. එවැනි අවස්ථාවන්හි දී අනුක්‍රමික වස්තුව හා සම්බන්ධ අනුක්‍රමික වර්ෂන් යූඅයිඩී ඩෙසරයිලේෂන් පරිසරයේ දී ගණනය කරන ලද පන්තියේ අනුක්‍රමික අනුවාදයට වඩා වෙනස් වේ. අනෙක් අතට ආසියානුකරණය සාර්ථක නොවනු ඇත. එබැවින් එවැනි තත්වයන් / ගැටළු මඟහරවා ගැනීම සඳහා ක්‍රමලේඛකයා සෑම විටම අනුක්‍රමික පන්තියේ අනුක්‍රමික අනුවාදය නියම කළ යුතුය.


2
ඇල්ගොරිතම වෙනස් නොවේ, නමුත් එය තරමක් නිශ්චිතව දක්වා නැත.
මාක්විස් ඔෆ් ලෝර්න්

... ඇල්ගොරිතම වෙනස් නොවේ, නමුත් එය තරමක් නිශ්චිතව දක්වා නැත ... එයින් අදහස් වන්නේ ඕනෑම jvm එකක් වෙනස් විය හැකි බවයි ..... @ user207421
අන්තෝ ජේ ක්ලින්ක්

18

කරදර නොවන්න, පෙරනිමි ගණනය කිරීම ඇත්තෙන්ම හොඳ වන අතර 99,9999% ක් සඳහා එය ප්‍රමාණවත් වේ. ඔබ ගැටළු වලට මුහුණ දෙන්නේ නම්, ඔබට දැනටමත් සඳහන් කර ඇති පරිදි - අවශ්‍යතාවය අනුව UID හඳුන්වා දිය හැකිය (එය බොහෝ දුරට ඉඩක් නැත)


2
කුණු. පංතිය වෙනස් වී නොමැති අවස්ථාවක එය ප්‍රමාණවත් වේ. '99 .9999% 'සඳහා සහය දැක්වීමට ඔබට ශුන්‍ය සාක්ෂි තිබේ.
මාර්ක්විස් ඔෆ් ලෝර්න්

18

නැතිවූ අනුක්‍රමික VersionUID ගැටලුවක් ඇති කළ හැකි උදාහරණයක් සඳහා:

මොඩියුලයක් භාවිතා කරන වෙබ් මොඩියුලයකින් සමන්විත මෙම ජාවා ඊඊ යෙදුම මත මම වැඩ කරමින් සිටිමි EJB. වෙබ් මොඩියුලය EJBමොඩියුලය දුරස්ථව අමතන අතර එය තර්කයක් ලෙස POJOක්‍රියාත්මක Serializableකරයි.

මෙම POJO'sපංතිය EJB භාජනය තුළ සහ වෙබ් මොඩියුලයේ WEB-INF / lib හි ඇති භාජනයක් තුළ ඇසුරුම් කර ඇත. ඔවුන් ඇත්ත වශයෙන්ම එකම පන්තියකි, නමුත් මම EJB මොඩියුලය ඇසුරුම් කරන විට මම මෙම POJO හි භාජනය ඉවත් කර එය EJB මොඩියුලය සමඟ ඇසුරුම් කරමි.

EJBපහත දැක්වෙන ව්‍යතිරේකය සමඟ ඇමතුම අසාර්ථක විය, මන්ද මම එය ප්‍රකාශ කර නොතිබුණි serialVersionUID:

Caused by: java.io.IOException: Mismatched serialization UIDs : Source
 (Rep.
 IDRMI:com.hordine.pedra.softbudget.domain.Budget:5CF7CE11E6810A36:04A3FEBED5DA4588)
 = 04A3FEBED5DA4588 whereas Target (Rep. ID RMI:com.hordine.pedra.softbudget.domain.Budget:7AF5ED7A7CFDFF31:6227F23FA74A9A52)
 = 6227F23FA74A9A52

16

මම සාමාන්‍යයෙන් භාවිතා serialVersionUIDකරන්නේ එක් සන්දර්භයක ය: මා දන්නා විට එය ජාවා වීඑම් හි සන්දර්භයෙන් ඉවත්ව යනු ඇත.

මම මෙය භාවිතා කරන විට ObjectInputStreamසහ ObjectOutputStreamමගේ යෙදුම සඳහා මෙය දැනගනු ඇත හෝ මා භාවිතා කරන පුස්තකාලයක් / රාමුවක් මා දන්නේ නම් එය භාවිතා කරනු ඇත. විවිධාකාර අනුවාදවල හෝ වෙළෙන්දන්ගේ විවිධ ජාවා වීඑම් යන්ත්‍ර නිවැරදිව ක්‍රියාත්මක වන බව හෝ එය වීඑම් එකෙන් පිටත ගබඩා කර නැවත ලබා ගන්නේ නම් HttpSession, සැසි දත්ත නැවත ආරම්භ කිරීම සහ යෙදුම් සේවාදායකය යාවත්කාලීන කිරීමේදී පවා පැවතිය හැකිය.

අනෙක් සියලුම අවස්ථා සඳහා, මම භාවිතා කරමි

@SuppressWarnings("serial")

බොහෝ විට පෙරනිමිය serialVersionUIDප්‍රමාණවත් බැවින්. මෙයට ඇතුළත් වේ Exception, HttpServlet.


ඒවා මාරු කළ හැකි බහාලුම්වල HttpServlet හෝ උදාහරණයක් ලෙස RMI හි ව්‍යතිරේකය ඇතුළත් නොවේ.
මාක්විස් ඔෆ් ලෝර්න්

14

ක්ෂේත්‍ර දත්ත පන්තියේ ගබඩා කර ඇති සමහර තොරතුරු නියෝජනය කරයි. පංතිය Serializableඅතුරු මුහුණත ක්‍රියාත්මක කරයි , එබැවින් සූර්යග්‍රහණය ස්වයංක්‍රීයව serialVersionUIDක්ෂේත්‍රය ප්‍රකාශ කිරීමට ඉදිරිපත් වේ . එහි 1 වන අගය සමඟ ආරම්භ කරමු.

එම අනතුරු ඇඟවීම ඔබට අවශ්‍ය නැතිනම් මෙය භාවිතා කරන්න:

@SuppressWarnings("serial")

11

Serializable ක්‍රියාත්මක කරන පන්තියක SerialVersionUID ට හොඳ වටිනාකමක් ඇති බව චෙක්ස්ටයිල්ට තහවුරු කර ගත හැකි නම් හොඳයි, එනම් එය අනුක්‍රමික හැඳුනුම් උත්පාදක යන්ත්රය නිපදවන දේට ගැලපේ. ඔබට අනුක්‍රමික ඩීටීඕ විශාල ප්‍රමාණයක් ඇති ව්‍යාපෘතියක් තිබේ නම්, උදාහරණයක් ලෙස, පවතින අනුක්‍රමික අනුවාදය යූඅයිඩී මකා දමා නැවත ප්‍රතිනිර්මාණය කිරීම මතක තබා ගැනීම වේදනාකාරී වන අතර, දැනට මෙය සත්‍යාපනය කිරීමට ඇති එකම ක්‍රමය (මා දන්නා) එක් එක් පන්තිය සඳහා ප්‍රතිජනනය කර සංසන්දනය කිරීමයි. පරණ එක. මෙය ඉතා වේදනාකාරී ය.


8
ඔබ සෑම විටම උත්පාදක යන්ත්රය නිපදවන එකම අගයට අනුක්‍රමික VersionUID සකසන්නේ නම්, ඔබට එය කිසිසේත් අවශ්‍ය නොවේ. සියල්ලට පසු, එහි රයිසන් ඩිට්‍රේ යනු පංතිය තවමත් අනුකූල වන විට වෙනස්කම් වලින් පසුවද රැඳී සිටීමයි.
Paŭlo Ebermann

4
හේතුව එසේ වන්නේ විවිධ සම්පාදකයින් එකම පන්තියකට එකම අගයක් ගෙන ඒමයි. ජාවාඩොක්ස් හි විස්තර කර ඇති පරිදි (ඉහත පිළිතුරු ද ඇත), ජනනය කරන ලද අනුවාදය අස්ථාවර වන අතර පන්තිය නිසි ලෙස ආශිර්වාද කළ හැකි වුවද වෙනස් විය හැකිය. ඔබ සෑම විටම එකම සම්පාදකයෙකු මත මෙම පරීක්ෂණය ක්‍රියාත්මක කරන තාක් කල් එය ආරක්ෂිත විය යුතුය. ඔබ කේතය වෙනස් නොකළද, ඔබ jdk යාවත්කාලීන කර නව රීතියක් එළියට එන්නේ නම් දෙවියන් ඔබට උදව් කරයි.
ඇන්ඩ rew බැකර්

2
serialverනිපදවන දෙයට ගැලපීම අවශ්‍ය නොවේ . -1
ලෝර්න් හි මාක්විස්

පොදුවේ එය කිසිසේත් අවශ්‍ය නොවේ. @ ඇන්ඩ rew බැකර්ගේ නඩුවට එකම .ජාවා ගොනුවේ වෙනස් සම්පාදකයින් දෙදෙනෙකු අවශ්‍ය වේ .කලාස් ලිපිගොනු දෙකම එකිනෙකා සමඟ සන්නිවේදනය කරයි - බොහෝ විට ඔබ පන්තිය නිර්මාණය කර බෙදා හරිනු ලැබේ. එය එසේ නම්, SUID එකක් නොතිබීම හොඳ වනු ඇත.
බිල් කේ

1
ගබඩා කිරීම / නැවත ලබා ගැනීම සඳහා සැබවින්ම අනුක්‍රමිකකරණය භාවිතා කරන පුද්ගලයින් සාමාන්‍යයෙන් 1 ලෙස සකසනු ඇත serialVersionUID. පන්තියේ නවතම අනුවාදයක් නොගැලපෙන නමුත් පැරණි දත්ත හැසිරවීමට තවමත් අවශ්‍ය නම්, ඔබ අනුවාද අංකය වැඩි කර විශේෂ කේතයක් එක් කරන්න පැරණි ආකෘති සමඟ ගනුදෙනු කරන්න. serialVersionUIDඉලක්කම් 1 ට වඩා විශාල වන සෑම අවස්ථාවකම මම අ cry නවා, එය අහඹු අංකයක් (නිෂ් less ල) නිසා හෝ පන්තියට විවිධ අනුවාද 10 කට වඩා ගනුදෙනු කිරීමට අවශ්‍ය නිසා.
john16384

11

වස්තුවෙහි අනුවාද පාලනය සඳහා SerialVersionUID භාවිතා කරයි. ඔබේ පන්ති ගොනුවේද serialVersionUID නියම කළ හැකිය. SerialVersionUID නියම නොකිරීමේ ප්‍රතිවිපාකය නම්, ඔබ පන්තියේ කිසියම් ක්ෂේත්‍රයක් එකතු කරන විට හෝ වෙනස් කරන විට දැනටමත් අනුක්‍රමික පන්තියට නැවත යථා තත්ත්වයට පත් නොවනු ඇත, මන්ද නව පන්තිය සඳහා සහ පැරණි අනුක්‍රමික වස්තුව සඳහා අනුක්‍රමික අනුවාදය වෙනස් වේ. ජාවා අනුක්‍රමිකකරණ ක්‍රියාවලිය අනුක්‍රමික වස්තුවක තත්වය යථා තත්වයට පත් කිරීම සඳහා නිවැරදි අනුක්‍රමික වර්ෂන් යූඅයිඩී මත රඳා පවතින අතර අනුක්‍රමික අනුවාදය යූඅයිඩී නොගැලපීමකදී java.io.InvalidClassException විසි කරයි.

වැඩිදුර කියවන්න: http://javarevisited.blogspot.com/2011/04/top-10-java-serialization-interview.html#ixzz3VQxnpOPZ


9

ඇයි භාවිතය SerialVersionUIDතුල Serializableජාවා පන්තිය?

අතරතුර serialization, ජාවා ධාවන කාලය පන්තියක් සඳහා අනුවාද අංකයක් නිර්මාණය කරයි, එවිට එය පසුව අනුක්‍රමිකකරණය කළ හැකිය. මෙම අනුවාද අංකය SerialVersionUIDජාවා හි හැඳින්වේ .

SerialVersionUIDඅනුක්‍රමික දත්ත සංස්කරණය කිරීමට භාවිතා කරයි. ඔබට පන්තියක් අක්‍රීය කළ හැක්කේ SerialVersionUIDඅනුක්‍රමික උදාහරණය සමඟ ගැලපෙන්නේ නම් පමණි . අපි SerialVersionUIDඅපේ පන්තියේ ප්‍රකාශ නොකරන විට , ජාවා ධාවන කාලය එය අප වෙනුවෙන් ජනනය කරන නමුත් එය නිර්දේශ නොකරයි. පෙරනිමි යාන්ත්‍රණය වළක්වා ගැනීම සඳහා විචල්‍ය SerialVersionUIDලෙස ප්‍රකාශ කිරීම රෙකමදාරු කරනු ලැබේ private static final long.

Serializableමාකර් අතුරුමුහුණත ක්‍රියාත්මක කිරීමෙන් ඔබ පන්තියක් ප්‍රකාශයට පත් කරන විට java.io.Serializable, ජාවා ධාවන වේලාව පෙරනිමි අනුක්‍රමිකකරණ යාන්ත්‍රණයක් භාවිතා කරමින් එම පන්තියේ තැටිය තුළට ගෙන යයි, ඔබ Externalizableඅතුරු මුහුණත භාවිතයෙන් ක්‍රියාවලිය අභිරුචිකරණය කර නොමැති නම් .

ජාවා හි අනුක්‍රමික පන්තිය තුළ SerialVersionUID භාවිතා කරන්නේ ඇයිද යන්නත් බලන්න


8

පැරණි පංති සමඟ ගැළපුම පවත්වා ගනිමින් පළමු වරට අනුක්‍රමික අනුවාදයක් නොතිබූ පන්ති විශාල සංඛ්‍යාවක් සංශෝධනය කිරීමට ඔබට අවශ්‍ය නම්, ඉන්ටෙලි ජේ අයිඩියා, සූර්යග්‍රහණය වැනි මෙවලම් අහඹු සංඛ්‍යා උත්පාදනය කරන අතර ලිපිගොනු පොකුරක් මත ක්‍රියා නොකරයි. එකවරම. SerialVersionUID නිකුතුව පහසුවෙන් සංශෝධනය කිරීම සඳහා මම පහත දැක්වෙන bash ස්ක්‍රිප්ට් එක (වින්ඩෝස් පරිශීලකයින් ගැන කණගාටුයි, මැක් එකක් මිලදී ගැනීම හෝ ලිනක්ස් වෙත පරිවර්තනය කිරීම සලකා බලන්න):

base_dir=$(pwd)                                                                  
src_dir=$base_dir/src/main/java                                                  
ic_api_cp=$base_dir/target/classes                                               

while read f                                                                     
do                                                                               
    clazz=${f//\//.}                                                             
    clazz=${clazz/%.java/}                                                       
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

ඔබ මෙම ස්ක්‍රිප්ට් එක සුරකිනු ඇත, add_serialVersionUID.sh ඔබට කියන්න ~ / bin. ඉන්පසු ඔබ එය ඔබේ මේවන් හෝ ග්‍රේඩ්ල් ව්‍යාපෘතියේ මූල නාමාවලියෙහි ක්‍රියාත්මක කරයි:

add_serialVersionUID.sh < myJavaToAmend.lst

මෙම .lst හි පහත දැක්වෙන ආකෘතියට serialVersionUID එක් කිරීමට java ගොනු ලැයිස්තුව ඇතුළත් වේ:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

මෙම ස්ක්‍රිප්ට් එක හුඩ් යටතේ JDK serialVer මෙවලම භාවිතා කරයි. එබැවින් ඔබගේ $ JAVA_HOME / බඳුන PATH හි ඇති බවට වග බලා ගන්න.


2
මට අදහසක් ලබා දෙයි: නිකුතුවක් කිරීමට පෙර, කිසි විටෙකත් අතින්, මෙවැනි මෙවලමක් සමඟ අනුක්‍රමික අනුවාදය uid ප්‍රතිනිර්මාණය කරන්න - ඒ ආකාරයෙන්, සත්‍යයක් නිසා අනුක්‍රමික අනුවාදය uid වෙනස් විය යුතු පන්තියකට වෙනසක් කිරීමට ඔබ අමතක නොකරයි. නොගැලපෙන වෙනසක්. එය අතින් නිරීක්ෂණය කිරීම ඉතා අපහසුය.
ඉග්නසියෝ

6

මෙම ප්‍රශ්නය ජොෂුවා බ්ලොච් විසින් Java ලදායී ජාවා හි ලේඛනගත කර ඇත. ඉතා හොඳ පොතක් සහ කියවිය යුතුම දෙයක්. මම පහත හේතු කිහිපයක් දක්වන්නෙමි:

අනුක්‍රමික ධාවන කාලය එක් එක් අනුක්‍රමික පන්තිය සඳහා අනුක්‍රමික අනුවාදය නමින් අංකයක් සමඟ පැමිණේ. මෙම අංකය serialVersionUID ලෙස හැඳින්වේ. දැන් මෙම අංකය පිටුපස යම් ගණිතයක් ඇති අතර එය පන්තියේ අර්ථ දක්වා ඇති ක්ෂේත්‍ර / ක්‍රම මත පදනම්ව එළියට එයි. එකම පන්තිය සඳහා සෑම විටම එකම අනුවාදය ජනනය වේ. අනුක්‍රමික වස්තුවක් යවන්නා සහ ලබන්නා විසින් අනුක්‍රමිකකරණයට අනුකූල වන වස්තුව සඳහා පන්ති පටවා ඇති බව තහවුරු කර ගැනීම සඳහා මෙම අංකය භාවිතා කරනු ලැබේ. අනුරූප යවන්නාගේ පන්තියට වඩා වෙනස් අනුක්‍රමික VersionUID ඇති වස්තුව සඳහා ග්‍රාහකයා පන්තියක් පටවා ඇත්නම්, අවලංගු කිරීම හේතුවෙන් අවලංගු පන්තියේ එක්සෙප්ෂන් එකක් ලැබෙනු ඇත.

පංතිය අනුක්‍රමික නම්, ස්ථිතික, අවසාන සහ වර්ගයේ දිග විය යුතු “SerialVersionUID” නම් ක්ෂේත්‍රයක් ප්‍රකාශ කිරීමෙන් ඔබට ඔබේම SerialVersionUID පැහැදිලිව ප්‍රකාශ කළ හැකිය. සූර්යග්‍රහණය වැනි බොහෝ IDE ඔබට එම දිගු නූල ජනනය කිරීමට උපකාරී වේ.


6

වස්තුවක් අනුක්‍රමික කරන සෑම අවස්ථාවකම වස්තුව පන්තියේ අනුවාද හැඳුනුම් අංකයකින් මුද්‍රණය කරනු ලැබේ. මෙම හැඳුනුම්පත serialVersionUID ලෙස හැඳින්වේ එය පන්ති ව්යුහය පිළිබඳ තොරතුරු මත පදනම් ගණනය කර ඇත. ඔබ සේවක පංතියක් සාදා ඇති අතර එහි # 333 අනුවාදය (ජේවීඑම් විසින් පවරනු ලැබේ) ඇතැයි සිතමු, දැන් ඔබ එම පන්තියේ වස්තුව අනුක්‍රමික කරන විට (සේවක වස්තුව යැයි සිතමු), ජේවීඑම් එයට යූඅයිඩී # 333 ලෙස පවරනු ඇත.

තත්වයක් සලකා බලන්න - අනාගතයේදී ඔබට ඔබේ පන්තිය සංස්කරණය කිරීමට හෝ වෙනස් කිරීමට අවශ්‍ය වන අතර ඔබ එය වෙනස් කරන විට JVM විසින් එය නව UID එකක් ලබා දෙනු ඇත (# 444 යැයි සිතමු). දැන් ඔබ සේවක වස්තුව අවතක්සේරු කිරීමට උත්සාහ කරන විට, ජේවීඑම් විසින් අනුක්‍රමික වස්තුවේ (සේවක වස්තුව) අනුවාද හැඳුනුම්පත (# 333) පන්තියේ එනම් # 444 සමඟ සංසන්දනය කරනු ඇත (එය වෙනස් කළ බැවින්). සංසන්දනය කිරීමේදී JVM විසින් UID අනුවාදය දෙකම වෙනස් බව සොයා ගනු ඇති අතර එබැවින් Deserialization අසමත් වනු ඇත. එබැවින් එක් එක් පන්තිය සඳහා serialVersionID නිර්වචනය කරන්නේ නම් ක්‍රමලේඛකයා විසින්ම වේ. අනාගතයේදී පන්තිය පරිණාමය වුවද එය සමාන වනු ඇති අතර එම නිසා පංතිය වෙනස් වුවද පන්තිය අනුක්‍රමික වස්තුව සමඟ අනුකූල බව ජේවීඑම් සෑම විටම සොයා ගනී. වැඩි විස්තර සඳහා ඔබට HEAD FIRST JAVA හි 14 වන පරිච්ඡේදය බලන්න.


1
වස්තුවක පන්තිය අනුක්‍රමික වන සෑම අවස්ථාවකම serialVersionUIDසම්ප්‍රේෂණය වේ. එය සෑම වස්තුවක් සමඟම යවනු නොලැබේ.
ලෝර්න් හි මාක්විස්

3

සරල පැහැදිලි කිරීමක්:

  1. ඔබ දත්ත අනුක්‍රමික කරනවාද?

    අනුක්‍රමිකකරණය යනු මූලික වශයෙන් පන්ති දත්ත ගොනුවකට / ප්‍රවාහයකට / යනාදිය ලිවීමයි. De-serialization යනු එම දත්ත නැවත පන්තියකට කියවීමයි.

  2. ඔබ නිෂ්පාදනයට යාමට අදහස් කරනවාද?

    ඔබ වැදගත් නොවන / ව්‍යාජ දත්ත සමඟ යමක් පරීක්ෂා කරන්නේ නම්, ඒ ගැන කරදර නොවන්න (ඔබ සෘජුවම අනුක්‍රමිකකරණය පරීක්ෂා නොකරන්නේ නම්).

  3. මෙය පළමු අනුවාදයද?

    එසේ නම්, සකසන්න serialVersionUID=1L.

  4. මෙය දෙවන, තෙවන, ආදිය ප්‍රොඩ් අනුවාදයද?

    දැන් ඔබ ඒ ගැන කරදර serialVersionUIDවිය යුතු අතර එය ගැඹුරින් සොයා බැලිය යුතුය.

මූලික වශයෙන්, ඔබ ලිවීමට / කියවීමට අවශ්‍ය පංතියක් යාවත්කාලීන කරන විට ඔබ අනුවාදය නිවැරදිව යාවත්කාලීන නොකරන්නේ නම්, ඔබ පැරණි දත්ත කියවීමට උත්සාහ කරන විට දෝෂයක් ලැබෙනු ඇත.


2

'serialVersionUID' යනු කාන්තාරීකරණ ක්‍රියාවලියේදී පන්තියක් අද්විතීයව හඳුනා ගැනීම සඳහා භාවිතා කරන 64 බිට් අංකයකි. ඔබ වස්තුවක් අනුක්‍රමික කරන විට, පන්තියේ serialVersionUID ද ගොනුවට ලියා ඇත. ඔබ මෙම වස්තුව අවතක්සේරු කරන සෑම අවස්ථාවකම, ජාවා ධාවන කාලය මෙම අනුක්‍රමික අනුවාද දත්ත අනුක්‍රමික දත්ත වලින් උපුටා ගෙන පන්තිය සමඟ සමාන අගයක් සංසන්දනය කරයි. දෙකම නොගැලපේ නම්, 'java.io.InvalidClassException' විසි කරනු ලැබේ.

අනුක්‍රමික පංතියක් විසින් අනුක්‍රමික අනුවාදයක් පැහැදිලිව ප්‍රකාශ නොකරන්නේ නම්, අනුක්‍රමික ධාවන කාලය මඟින් පන්තියේ විවිධ අංශ, ක්ෂේත්‍ර, ක්‍රම වැනි විවිධ පන්ති මත පදනම්ව එම පන්තිය සඳහා අනුක්‍රමික වර්ෂන් යූඅයිඩී අගය ගණනය කරනු ලැබේ., ඔබට මෙම සබැඳිය ආදර්ශන යෙදුම සඳහා යොමු කළ හැකිය .


1

දිගු කතාව කෙටියෙන් කිවහොත්, මෙම ක්ෂේත්‍රය භාවිතා කරනුයේ අනුක්‍රමික දත්ත නිවැරදිව ආශ්‍රිත කළ හැකිද යන්න පරීක්ෂා කිරීමට ය. අනුක්‍රමිකකරණය සහ ආශ්‍රිතකරණය බොහෝ විට සිදු කරනුයේ විවිධ වැඩසටහන් වල පිටපත් මගිනි - නිදසුනක් ලෙස සේවාදායකයා වස්තුව නූල් බවට හරවන අතර සේවාදායකයා ලැබුනු නූල් වස්තුව බවට පරිවර්තනය කරයි. මෙම ක්ෂේත්‍රය පවසන්නේ මෙම වස්තුව යනු කුමක්ද යන්න පිළිබඳව දෙදෙනාම එකම අදහසකින් ක්‍රියාත්මක වන බවයි. මෙම ක්ෂේත්‍රය උපකාරී වන්නේ කවදාද:

  • ඔබේ වැඩසටහනේ විවිධ පිටපත් විවිධ ස්ථානවල ඇත (සේවාදායක 1 ක් සහ සේවාදායකයින් 100 ක් වැනි). ඔබ ඔබේ වස්තුව වෙනස් කරන්නේ නම්, ඔබේ අනුවාද අංකය වෙනස් කර මෙම සේවාදායකයින් යාවත්කාලීන කිරීමට අමතක කළහොත්, ඔහුට අවශ්‍ය වන්නේ ඔහු ආශ්‍රිතකරණය කිරීමට හැකියාවක් නොමැති බවයි

  • ඔබ ඔබේ දත්ත කිසියම් ගොනුවක ගබඩා කර ඇති අතර පසුව ඔබ එය නවීකරණය කරන ලද වස්තුවක් සමඟ ඔබේ වැඩසටහනේ යාවත්කාලීන කළ අනුවාදය සමඟ විවෘත කිරීමට උත්සාහ කරයි - ඔබ ඔබේ අනුවාදය නිවැරදිව තබා ගන්නේ නම් මෙම ගොනුව නොගැලපෙන බව ඔබ දැන ගනු ඇත

එය වැදගත් වන්නේ කවදාද?

වඩාත්ම පැහැදිලිව පෙනෙන - ඔබ ඔබේ වස්තුවට සමහර ක්ෂේත්‍ර එකතු කළහොත්, පැරණි අනුවාදයන්ට ඒවා භාවිතා කිරීමට නොහැකි වනුයේ ඒවායේ වස්තු ව්‍යුහය තුළ මෙම ක්ෂේත්‍ර නොමැති බැවිනි.

අඩු පැහැදිලිව පෙනෙන - ඔබ වස්තුව අවලංගු කරන විට, නූල්වල නොමැති ක්ෂේත්‍ර NULL ලෙස තබා ගනී. ඔබ ඔබේ වස්තුවෙන් ක්ෂේත්‍රය ඉවත් කර ඇත්නම්, පැරණි අනුවාදයන් මෙම ක්ෂේත්‍රය සැමවිටම-NULL ලෙස තබාගනු ඇත, පැරණි අනුවාදයන් මෙම ක්ෂේත්‍රයේ දත්ත මත රඳා පවතී නම් එය වැරදි ලෙස හැසිරීමට හේතු වේ (කෙසේ වෙතත් ඔබ එය නිර්මාණය කර ඇත්තේ විනෝදය සඳහා පමණක් නොවේ :-))

අවම වශයෙන් පැහැදිලිව පෙනේ - සමහර විට ඔබ යම් ක්ෂේත්‍රයක අර්ථය ඇතුළත් අදහස වෙනස් කරයි. උදාහරණයක් ලෙස ඔබට වයස අවුරුදු 12 දී ඔබ අදහස් කරන්නේ “බයිසිකලය” යටතේ “බයිසිකලයක්”, නමුත් ඔබ වයස අවුරුදු 18 දී ඔබ අදහස් කරන්නේ “යතුරුපැදිය” - ඔබේ මිතුරන් ඔබට “නගරය හරහා බයිසිකල් පැදීමට” ආරාධනා කළහොත් ඔබ පමණක් වනු ඇත බයිසිකලයෙන් පැමිණි විට, ක්ෂේත්‍රයන්හි එකම අර්ථයක් තබා ගැනීම කෙතරම් වැදගත් දැයි ඔබ වටහා ගනු ඇත :-)


1

පළමුවෙන්ම ඔබේ ප්‍රශ්නයට පිළිතුරු සැපයීම සඳහා, අපගේ පන්තියේදී අපි SerialVersionUID ප්‍රකාශයට පත් නොකරන විට, ජාවා ධාවන කාලය එය අප වෙනුවෙන් ජනනය කරයි, නමුත් එම ක්‍රියාවලිය ක්ෂේත්‍ර ගණන, ක්ෂේත්‍ර වර්ගය, ක්ෂේත්‍ර වෙනස් කිරීම, ක්ෂේත්‍ර වෙනස් කිරීම, අතුරු මුහුණත ඇතුළු බොහෝ පන්ති මෙටා දත්ත වලට සංවේදී වේ. පංතිය ආදිය අනුව. එබැවින් එය අප විසින්ම ප්‍රකාශයට පත් කිරීම රෙකමදාරු කරනු ලබන අතර සූර්යග්‍රහණය ඔබට ඒ ගැන අනතුරු අඟවයි.

අනුක්‍රමිකකරණය: අපි බොහෝ විට වැදගත් වස්තූන් සමඟ වැඩ කරන්නෙමු (වස්තුවේ විචල්‍යයන්හි දත්ත) ඉතා වැදගත් වන අතර බලය / පද්ධති අසමත්වීම් (හෝ) ජාල අසමත්වීම් හේතුවෙන් අපට එය අහිමි වීමේ අවදානමක් නොමැත. යන්ත්‍රය. මෙම ගැටළුවට විසඳුම නම් කර ඇත්තේ "නොනැසී පැවතීම" යන්නයි. අඛණ්ඩතාව සාක්ෂාත් කර ගැනීම සඳහා අනුක්‍රමිකකරණය තවත් බොහෝ ක්‍රමවලින් එකකි (දත්ත තැටියට / මතකයට සුරැකීමෙන්). වස්තුවේ තත්වය සුරැකීමේදී, වස්තුව සඳහා අනන්‍යතාවයක් නිර්මාණය කිරීම වැදගත් වන අතර, එය නිසි ලෙස නැවත කියවීමට හැකි වේ (අනුක්‍රමිකකරණය). මෙම අද්විතීය හඳුනාගැනීම ID යනු SerialVersionUID වේ.


0

SerialVersionUID යනු කුමක්ද? පිළිතුර: - පුද්ගලයන් දෙදෙනෙකු සිටින බව කියමු. මෙම අවස්ථාවෙහිදී, ODC හි සිටින ලබන්නා සත්‍යාපිත පුද්ගලයා බව තහවුරු කිරීම සඳහා, JVM විසින් අද්විතීය හැඳුනුම්පතක් සාදයි, එය SerialVersionUID ලෙස හැඳින්වේ.

මෙන්න තත්වය මත පදනම් වූ හොඳ පැහැදිලි කිරීමක්,

SerialVersionUID ඇයි?

Serialization : serialization එම අවස්ථාවේ දී, සෑම වස්තුව යවන්නාගේ පැත්තේ සමග JVM අද්විතීය හඳුන්වනය ඉතිරි කර දෙනු ඇත. යවන්නාගේ පද්ධතියේ ඇති අනුරූප .class ගොනුව මත පදනම්ව එම අද්විතීය හැඳුනුම්පත ජනනය කිරීමට JVM වගකීම දරයි.

Deserialization : deserialization අවස්ථාවේ දී, ග්‍රාහක පැත්තේ JVM විසින් වස්තුව හා සම්බන්ධ අද්විතීය හැඳුනුම්පත දේශීය පන්තියේ අද්විතීය හැඳුනුම්පත සමඟ සංසන්දනය කරනු ඇත, එනම් JVM විසින් ග්‍රාහක පද්ධතියේ ඇති අනුරූප .class ගොනුව මත පදනම්ව අද්විතීය හැඳුනුම්පතක් සාදනු ඇත. අද්විතීය හැඳුනුම්පත දෙකම ගැලපෙන්නේ නම්, පසුව සිදු කරනු ලබන්නේ ඩෙසරීකරණය පමණි. නැතිනම් අපට InvalidClassException කියමින් ධාවන කාල ව්‍යතිරේකය ලැබෙනු ඇත. මෙම අද්විතීය හැඳුනුම්පත SerialVersionUID හැර අන් කිසිවක් නොවේ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.