JavaRush /Java blogi /Random-UZ /Interfeyslar - markerlar
dupliaka
Daraja
Санкт-Петербург

Interfeyslar - markerlar

Guruhda nashr etilgan
Marker interfeyslari interfeys va sinfni bog'lash imkonini beruvchi ish vaqti turini tekshirishga ega dizayn namunasidir. Bu nima uchun zarur bo'lishi mumkinligini tushunish uchun Serializible sinfini marker bilan belgilash misolini ko'rib chiqing. Faraz qilaylik, biz ob'ektning holatini xotirada saqlashimiz kerak edi, keyin esa biz saqlagan narsaning shifrini ochishimiz mumkin. Keyin, siz aytasiz, biz o'z ob'ektimizni bitlar to'plamiga aylantira olamiz. To'g'ri. FileInputStream-dan foydalanib faylga yozishning oddiy usulidan foydalanishimiz mumkin, lekin bu faqat bir nechta ob'ektlar bo'lsa qulay, lekin agar ular ko'p bo'lsa-chi? Buning uchun ajoyib serializatsiya vositasi mavjud. Uni ishlatishda asosiy qoida shundaki, ketma-ketlashtirilayotgan ob'ekt barcha ma'lumotlarni o'z ichiga olishi va boshqa ob'ektlarga murojaat qilmasligi kerak. "Aha, maydonlarga havola qilinmagan va Serializable markerni qo'yish yaxshi" sinfiga qarang. Va siz uni qo'yganingizda, bu siz belgilagan ob'ektlar ObjectOutputStream-ga yozilishi mumkinligini anglatadi. ObjectOutputStream klassida writeObject0() usuli mavjud va u ob'ektni yozish mumkinligini tekshiradigan instanceof tekshiruvlarini o'z ichiga oladi va agar barcha tekshiruvlar ketma-ketligi bajarilmasa, NotSerializableException istisno qilinadi va agar bo'lmasa, hammasi xotiraga aniq yoziladi. Keling, BigObject klassini yarataylik, uning misollarini seriyalashtiramiz package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } BigObject klassi allaqachon Serializable sifatida belgilangan. Unda bitta identifikator maydoni va unga hamroh bo'lgan olish/to'siq usullari mavjud. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream(); ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer); outputStream.writeObject(objectOriginal); outputStream.close(); byte[] buffer = writeBuffer.toByteArray(); ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer); ObjectInputStream inputStream = new ObjectInputStream(readBuffer); BigObject objectCopy = (BigObject)inputStream.readObject(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

Ob'ektni yozib olish

Birinchidan, biz BigObject seriyali sinfining ob'ektini yaratamiz, so'ngra u uchun ma'lumotlar buferini tayyorlaymiz - bu ByteArrayOutputStream barcha kamonlarini qo'yadigan joy. Keyin yuqorida aytib o'tilgan ObjectOutputStream ni tayyorlaymiz va unga buferni o'tkazamiz.O'z ob'ektimizni oqimga yozamiz va uni yopamiz.

Ob'ektni o'qish

ReadBuffer yozish buferini tayyorlaymiz, inputStreamni o'tkazamiz, readObject() ni o'qiymiz. Endi ob'ekt qayta tiklandi. “Id” maydoni havola boʻlmagani uchun biz oʻz maʼlumotlarini toʻliq oʻz ichiga olgan Serializable sinfini belgilashga muvaffaq boʻldik. Sinfimizga tasdiqlash funktsiyalarini qo'shish o'rniga, tokenlar bizga sinfni tekshirish jarayonini soddalashtirishga imkon beradi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION