JavaRush /Java блогы /Random-KK /Интерфейстер – маркерлер
dupliaka
Деңгей
Санкт-Петербург

Интерфейстер – маркерлер

Топта жарияланған
Маркер интерфейстері интерфейс пен сыныпты байланыстыруға мүмкіндік беретін орындау уақыты түрін тексеруі бар дизайн үлгісі болып табылады. Неліктен бұл қажет болуы мүмкін екенін түсіну үшін, Serializible класын маркермен белгілеу мысалын қарастырыңыз. Нысанның күйін жадта сақтауымыз керек деп есептейік, содан кейін біз сақтағанның шифрын шеше аламыз. Содан кейін, сіз айтасыз, біз өз нысанымызды биттер жиынтығына айналдыра аламыз. Дұрыс. FileInputStream көмегімен файлға жазудың қарапайым әдісін пайдалана аламыз, бірақ бұл нысандар аз болған жағдайда ғана ыңғайлы, бірақ олардың саны көп болса ше? Бұл үшін тамаша сериялау құралы бар. Оны пайдаланған кездегі негізгі ереже серияланатын нысанда барлық деректер болуы керек және басқа нысандарға сілтеме болмауы керек. «Аха, өрістерге сілтеме жоқ және Серияланатын маркерді қойған дұрыс» сыныбына қараңыз. Ал сіз оны қойған кезде бұл сіз белгілеген нысандарды ObjectOutputStream қызметіне жазуға болатынын білдіреді. ObjectOutputStream сыныбында writeObject0() әдісі бар және ол нысанның жазылу мүмкіндігін тексеретін instanceof тексерулерін қамтиды және тексерулердің бүкіл сериясы сәтсіз аяқталса, NotSerializableException ерекше жағдай шығарылады, ал егер олай болмаса, барлығы жадқа ұқыпты жазылады. BigObject сыныбын жасайық, оның даналары серияланатын болады 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 сыныбы бұрыннан Serializable ретінде белгіленген. Оның бір идентификатор өрісі және ілеспе алу/орнату әдістері бар. 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"); } }

Объектіні жазу

Алдымен біз BigObject сериялы класының an objectісін жасаймыз, содан кейін біз оған деректер буферін дайындаймыз - біз ByteArrayOutputStream барлық садақтарын қоятын орын. Содан кейін бұрын айтылған ObjectOutputStream дайындап, оған буферді жібереміз.Объектімізді ағынға жазып, оны жабамыз.

Объектіні оқу

ReadBuffer жазу буферін дайындаймыз, inputStream жібереміз, readObject() оқимыз. Қазір нысан қалпына келтірілді. `id` өрісі сілтеме болмағандықтан, біз оның деректерін толығымен қамтитын Serializable класын белгілей алдық. Біздің сыныпқа валидация функцияларын қосудың орнына, таңбалауыштар бізге сыныпты тексеру процесін жеңілдетуге мүмкіндік береді.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION