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

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

Группада жарыяланган
Маркер интерфейстери интерфейсти жана классты байланыштырууга мүмкүндүк берген иштөө убактысынын түрүн текшерүү менен дизайн үлгүсү. Бул эмне үчүн зарыл болушу мүмкүн экенин түшүнүү үчүн, Serializible классын маркер менен белгилөөнүн мисалын карап көрөлү. Келгиле, биз an objectтин абалын эс тутумга сактап, андан кийин сактаган нерсени чечмелей алышыбыз керек деп ойлойлу. Андан кийин, сиз айтасыз, биз an objectибизди биттердин жыйындысына айландыра алабыз. Туура. FileInputStream аркылуу файлга жазуунун жөнөкөй ыкмасын колдоно алабыз, бирок бул an objectтер аз болгондо гана ыңгайлуу, бирок алардын саны көп болсочы? Бул үчүн сонун сериалдаштыруу куралы бар. Аны колдонууда негизги эреже - сериялаштырылган an object бардык маалыматтарды камтышы керек жана башка an objectтерге кайрылбашы керек. Классыңызды караңыз: "Аха, талааларга шилтеме берилген эмес жана Сериялаштырылуучу маркерди коюу жакшы." Жана сиз аны койгондо, бул сиз белгилеген an objectтерди ObjectOutputStreamге жазууга болот дегенди билдирет. ObjectOutputStream классында writeObject0() методу бар жана ал an objectтин жазылышын текшерген 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 деп белгиленген. Анын бир id талаасы жана аны коштогон алуу/коюу ыкмалары бар. 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() окуйлу. Учурда an object калыбына келтирилди. `id` талаасы шилтеме болбогондуктан, биз анын маалыматтарын толугу менен камтыган Serializable классын белгилей алдык. Биздин класстын ичинде валидация функцияларын кошуунун ордуна, токендер классты текшерүү процессин жөнөкөйлөтүүгө мүмкүндүк берет.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION