JavaRush /Блоги Java /Random-TG /Интерфейсҳо - маркерҳо
dupliaka
Сатҳи
Санкт-Петербург

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

Дар гурӯҳ нашр шудааст
Интерфейсҳои маркерӣ як намунаи тарроҳӣ бо санҷиши намуди вақт мебошанд, ки ба шумо имкон медиҳад интерфейс ва синфро пайваст кунед. Барои фаҳмидани он ки чаро ин метавонад зарур бошад, мисоли аломатгузории синфи Serializible бо маркерро дида бароед. Биёед фарз кунем, ки ба мо лозим буд, ки ҳолати an objectро дар хотира нигоҳ дорем ва сипас он чизеро, ки захира кардем, рамзкушоӣ кунем. Пас, шумо мегӯед, мо метавонем an objectи худро ба маҷмӯи битҳо табдил диҳем. Дуруст. Мо метавонем роҳи оддии навиштан ба файлро бо истифода аз FileInputStream истифода барем, аммо ин танҳо дар сурати кам будани an objectҳо қулай аст, аммо агар шумораи онҳо зиёд бошад-чӣ? Барои ин як воситаи олиҷаноби сериализатсия мавҷуд аст. Қоидаи асосӣ ҳангоми истифодаи он ин аст, ки an objectи сериализатсияшуда бояд ҳама маълумотро дар бар гирад ва ба an objectҳои дигар ишора накунад. Ба синфи худ нигаред "Аҳа, майдонҳо истинод карда нашудаанд ва гузоштани аломати Serializable хуб аст." Ва вақте ки шумо онро гузоштаед, ин маънои онро дорад, ки an objectҳое, ки шумо қайд кардаед, метавонанд ба ObjectOutputStream навишта шаванд. Синфи ObjectOutputStream дорои усули writeObject0() буда, он instanceof чекҳоро дар бар мегирад, ки оё an objectро навиштан мумкин аст ва агар тамоми силсилаи чекҳо ноком шаванд, истиснои 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"); } }

Сабти an object

Аввалан, мо an objectи синфи сериализатсияшавандаи BigObject месозем, сипас барои он буфери маълумот омода мекунем - ҷое, ки мо тамоми камонҳоро ByteArrayOutputStream мегузорем. Баъд мо ObjectOutputStream-и зикршударо омода мекунем ва буферро ба он мегузарем.Мо an objectи худро ба стрим менависем ва онро мепӯшем.

Хондани an object

Биёед буфери навиштани readBuffer омода кунем, inputStream-ро гузаронем, readObject() хонем. Ҳоло an object барқарор карда шудааст. Бо шарофати он, ки майдони `id` пайванд набуд, мо тавонистем синфи Serializable-ро қайд кунем, ки маълумоти онро пурра дар бар мегирад. Ба ҷои илова кардани функсияҳои тасдиқкунӣ дар дохor синфи мо, токенҳо ба мо имкон медиҳанд, ки раванди тасдиқи синфро содда кунем.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION