74-bob: To'plamlarni tanlash


-bo'lim: Maxsus seriyalashtirish


Download 342.92 Kb.
Pdf ko'rish
bet3/6
Sana24.12.2022
Hajmi342.92 Kb.
#1063446
1   2   3   4   5   6
Bog'liq
dasturlash maruza orginali (2)

75.2-bo'lim: Maxsus seriyalashtirish 
Ushbu misolda biz a orasida tasodifiy sonni yaratadigan va konsolga chiqaradigan sinf 
yaratmoqchimiz 
ishga tushirish vaqtida argument sifatida uzatiladigan ikkita tamsayı diapazoni. 
Endi biz ushbu sinfni Serializable qilishni istasak, ba'zi muammolar bo'ladi. Thread - bu 
aniq narsalardan biri 
Serializatsiya qilinmaydigan tizim darajasidagi sinflar. Shunday qilib, biz ipni vaqtinchalik 
deb e'lon qilishimiz kerak. Buni amalga oshirish orqali biz qilamiz 
bu sinf ob'ektlarini ketma-ketlashtirish mumkin, ammo bizda hali ham muammo bo'ladi. 
Konstruktorda ko'rib turganingizdek, biz o'rnatdik 
Randomizatorimizning minimal va maksimal qiymatlari va shundan so'ng biz mas'ul 
bo'lgan ipni boshlaymiz 
tasodifiy qiymatni yaratish va chop etish. Shunday qilib, readObject() ni chaqirish orqali 
doimiy ob'ektni tiklashda 


konstruktor qayta ishlamaydi, chunki yangi ob'ekt yaratilmaydi. Bunday holda, biz 
Customni ishlab chiqishimiz kerak 
Sinf ichida ikkita usulni ta'minlash orqali ketma-ketlashtirish. Bu usullar quyidagilardir: 
Shunday qilib, readObject() ga ilovamizni qo'shish orqali biz mavzuni boshlashimiz va 
boshlashimiz mumkin: 
Bizning misolimiz uchun asosiysi: 


Agar siz asosiyni ishga tushirsangiz, har bir RangeRandom misoli uchun ikkita ish 
zarrachalari ishlayotganligini ko'rasiz va bu 
chunki Thread.start() usuli endi konstruktorda ham, readObject()da ham mavjud. 
75.3-bo'lim: Versiyalash va serialVersionUID 
Sinfni serializatsiya qilish uchun java.io.Serializable interfeysini qo'llaganingizda, 
kompilyator statikni qidiradi. 
long tipidagi serialVersionUID nomli yakuniy maydon. Agar sinfda bu maydon aniq e'lon 
qilinmasa, u holda 
kompilyator shunday maydonni yaratadi va uni amalga oshirishga bog'liq bo'lgan qiymat 
bilan tayinlaydi 
serialVersionUID ni hisoblash. Ushbu hisoblash sinfning turli jihatlariga bog'liq va u 
quyidagicha 
Sun tomonidan berilgan ob'ektni ketma-ketlashtirish spetsifikatsiyalari. Biroq, qiymat 
barcha kompilyatorlarda bir xil bo'lishi kafolatlanmaydi 
amalga oshirishlar. 
Ushbu qiymat sinflarning ketma-ketlashtirish bo'yicha mosligini tekshirish uchun 
ishlatiladi va bu saqlangan ob'ektni ketma-ketlashtirish paytida amalga oshiriladi. 
Serializatsiya Runtime serialVersionUID seriyasizlashtirilgan ma'lumotlardan o'qilganligini 
tekshiradi 


va sinfda e'lon qilingan serialVersionUID aynan bir xil. Agar bunday bo'lmasa, u bir 
tashlaydi 
InvalidClassException. 
Uzun va nomli turdagi statik, yakuniy maydonni aniq e'lon qilish va ishga tushirish tavsiya 
etiladi. 
'serialVersionUID' barcha sinflaringizda standart hisoblash o'rniga Serializable qilishni 
xohlaysiz. 
versiyani ishlatmasangiz ham, ushbu maydon uchun qiymat. 'serialVersionUID' hisoblash 
juda katta 
sezgir va bir kompilyatordan boshqasiga o'zgarishi mumkin va shuning uchun siz olishingiz 
mumkin 
InvalidClassException hatto bir xil sinf uchun ham faqat siz turli kompilyatordan 
foydalanganingiz uchun 
jo'natuvchi va qabul qiluvchidagi ilovalar ketma-ketlashtirish jarayoni tugaydi. 
Agar serialVersionUID bir xil bo'lsa, Java Serialization sinfning turli versiyalarini 
boshqarishi mumkin. Mos keladi va 
mos kelmaydigan o'zgarishlar; 
Mos keladigan o'zgarishlar 
Maydonlarni qo'shish: Qayta tiklanayotgan sinf oqimda bo'lmagan maydonga ega bo'lsa, bu 
maydon ichida 
ob'ekt o'z turi uchun standart qiymatga ishga tushiriladi. Agar sinfga xos ishga tushirish 
kerak bo'lsa, sinf 
maydonni standart bo'lmagan qiymatlarga ishga tushirishi mumkin bo'lgan readObject 
usulini taqdim etishi mumkin. 


Sinflarni qo'shish: oqim oqimdagi har bir ob'ektning tur ierarxiyasini o'z ichiga oladi. Buni 
solishtirish 
joriy sinf bilan oqimdagi ierarxiya qo'shimcha sinflarni aniqlashi mumkin. Chunki unda 
hech qanday ma'lumot yo'q 
ob'ektni ishga tushirish uchun oqim, sinfning maydonlari standart qiymatlarga ishga 
tushiriladi. 
Sinflarni olib tashlash: oqimdagi sinf ierarxiyasini joriy sinf bilan solishtirish aniqlanishi 
mumkin 
sinf o'chirildi. Bunday holda, ushbu sinfga mos keladigan maydonlar va ob'ektlar o'qiladi 
oqim. Primitiv maydonlar o'chiriladi, lekin o'chirilgan sinf tomonidan havola qilingan 
ob'ektlar yaratiladi, chunki 
ular keyinchalik oqimda ko'rsatilishi mumkin. Oqim axlat yig'ilganda yoki qayta 
o'rnatilganda ular axlat yig'iladi. 
writeObject/readObject usullarini qo'shish: Agar oqimni o'qiyotgan versiyada bu usullar 
mavjud bo'lsa 
readObject, odatdagidek, standart ketma-ketlashtirish orqali oqimga yozilgan kerakli 
ma'lumotlarni o'qishi kutilmoqda. 
Har qanday ixtiyoriy ma'lumotlarni o'qishdan oldin u defaultReadObject ni chaqirishi 
kerak. writeObject usuli kutilmoqda 
odatdagidek defaultWriteObject-ga qo'ng'iroq qilib, kerakli ma'lumotlarni yozish va keyin 
ixtiyoriy ma'lumotlarni yozish mumkin. 
java.io.Serializable qo'shish: Bu turlarni qo'shishga teng. Buning uchun oqimda hech 
qanday qiymat bo'lmaydi 
sinf, shuning uchun uning maydonlari standart qiymatlarga ishga tushiriladi. 
Seriyalashtirilmaydigan sinflarni pastki sinflarga ajratishni qo'llab-quvvatlash 


sinfning super turi no-arg konstruktoriga ega bo'lishini talab qiladi va sinfning o'zi sukut 
bo'yicha ishga tushiriladi 
qiymatlar. Agar no-arg konstruktori mavjud bo'lmasa, InvalidClassException tashlanadi. 
Maydonga kirishni o'zgartirish: umumiy, paketli, himoyalangan va xususiy kirish 
modifikatorlari hech qanday ta'sir qilmaydi 
maydonlarga qiymatlarni belgilash uchun ketma-ketlashtirish qobiliyati haqida. 
Maydonni statikdan statikga yoki vaqtinchalik o'tkinchiga o'zgartirish : Standartga 
tayangan holda 
serializatsiya qilinadigan maydonlarni hisoblash uchun ketma-ketlashtirish, bu o'zgarish 
sinfga maydon qo'shishga teng. The 
yangi maydon oqimga yoziladi, lekin oldingi sinflar qiymatni e'tiborsiz qoldiradi, chunki 
serializatsiya qilinmaydi 
statik yoki vaqtinchalik maydonlarga qiymatlarni belgilash. 
Mos kelmaydigan o'zgarishlar 
Maydonlarni o'chirish: Agar sinfda maydon o'chirilsa, yozilgan oqim uning qiymatini o'z 
ichiga olmaydi. Qachon oqim 
oldingi sinf tomonidan o'qilgan bo'lsa, maydon qiymati standart qiymatga o'rnatiladi, 
chunki hech qanday qiymat mavjud emas 
oqim. Biroq, bu standart qiymat oldingi versiyaning o'zini bajarish qobiliyatiga salbiy ta'sir 
ko'rsatishi mumkin 
shartnoma. 
Sinflarni ierarxiya boʻyicha yuqoriga yoki pastga siljitish : Bunga ruxsat berilmaydi, chunki 
oqimdagi maʼlumotlar paydo boʻladi 
noto'g'ri ketma-ketlik. 
Statik bo'lmagan maydonni statikga yoki o'tkinchi bo'lmagan maydonni o'tkinchiga 
o'zgartirish: Standartga tayanganda 


serializatsiya, bu o'zgarish maydonni sinfdan o'chirishga teng. Sinfning ushbu versiyasi 
yozilmaydi 
bu ma'lumotlarni oqimga yuboradi, shuning uchun uni sinfning oldingi versiyalari o'qishi 
mumkin bo'lmaydi. O'chirishda bo'lgani kabi 
maydon bo'lsa, oldingi versiyaning maydoni standart qiymatga ishga tushiriladi, bu esa 
sinfning ishlamay qolishiga olib kelishi mumkin 
kutilmagan usullar. 
Ibtidoiy maydonning e'lon qilingan turini o'zgartirish: sinfning har bir versiyasi 
ma'lumotlarni e'lon qilingan bilan yozadi. 
turi. Maydonni o'qishga urinayotgan sinfning oldingi versiyalari muvaffaqiyatsiz bo'ladi, 
chunki ma'lumotlarning turi 
oqim maydon turiga mos kelmaydi. 
writeObject yoki readObject usulini endi standart maydon maʼlumotlarini yozmasligi yoki 
oʻqimasligi uchun oʻzgartirish yoki 
oldingi versiyada yozilmaganda uni yozishga yoki o'qishga harakat qilish uchun uni 
o'zgartirish. Standart maydon ma'lumotlari 
oqimda doimiy ravishda paydo bo'lishi yoki ko'rinmasligi kerak. 
Sinfni Serializable'dan Externalizable'ga yoki aksincha o'zgartirish oqimdan beri mos 
kelmaydigan o'zgarishdir. 
mavjud sinfni amalga oshirishga mos kelmaydigan ma'lumotlarni o'z ichiga oladi. 
Sinfni sanab bo'lmagan turidan enum turiga yoki aksincha o'zgartirish, chunki oqim 
quyidagi ma'lumotlarni o'z ichiga oladi. 
mavjud sinfni amalga oshirish bilan mos kelmaydi. 
Serializable yoki Externalizable ikkalasini olib tashlash mos kelmaydigan o'zgarishdir, 
chunki yozilsa, u endi bo'lmaydi 
sinfning eski versiyalari uchun zarur bo'lgan maydonlarni taqdim eting. 


Sinfga writeReplace yoki readResolve usulini qo‘shish, agar xatti-harakatlar xatoni keltirib 
chiqarsa, mos kelmaydi 
sinfning eski versiyasiga mos kelmaydigan ob'ekt. 

Download 342.92 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling