74-bob: To'plamlarni tanlash
-bo'lim: Maxsus seriyalashtirish
Download 342.92 Kb. Pdf ko'rish
|
dasturlash maruza orginali (2)
- Bu sahifa navigatsiya:
- 75.3-bolim: Versiyalash va serialVersionUID
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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling