Маркерни интерфейси и дълбоки копия - 1

„Здрасти, Амиго!“

„Здравей, Билаабо!“

„Днес ще ви разкажа за интерфейсите на маркерите .“

"Маркерните интерфейси са интерфейси без методи. Когато клас имплементира такъв интерфейс, казваме, че той е маркиран от него."

„Примерите за тези интерфейси включват: Cloneable, Serializable, Remote .“

„ Интерфейсът Serializable се използва за маркиране на класове, които поддържат сериализация, което показва, че екземплярите на тези класове могат да бъдат автоматично сериализирани и десериализирани.“

Отдалеченият интерфейс се използва за идентифициране на обекти, които поддържат отдалечено изпълнение, т.е. методи, които могат да бъдат извикани от друга Java виртуална машина и/or друг компютър.“

„ Интерфейсът Cloneable се използва за маркиране на класове, които поддържат клониране.“

— О, относно клонирането or копирането.

„Има два вида копиране: плитко и дълбоко.“

" Плиткото копиране е създаване на копие на обект, без да се правят дубликати на който и да е от обектите, към които препраща."

" Дълбокото копиране включва дублиране на обект, включително обекти, към които той препраща, и обекти, които тези обекти препращат, и т.н."

„Има наистина добър начин за надеждно създаване на дълбок клонинг.“

"Този метод работи дори ако разработчиците са забравor да маркират клас като Cloneable. "Единственото изискване е обектите да могат да се сериализират."

„Ето How го правите:“

1) Създайте буфер (byteов масив) в паметта.

2) Сериализирайте обекта и подобектите в буфера.

3) Десериализирайте йерархията на обекта, записана в буфера.

Код
BigObject objectOriginal = new BigObject();

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();

"В първия ред създаваме objectOriginal , който ще клонираме. Обектът и всичките му подобекти трябва да поддържат сериализация."

„В третия ред създаваме ByteArrayOutputStream , който ще се разширява динамично, когато се добавят нови данни (като ArrayList).“

„В ред 4 създаваме ObjectOutputStream , който се използва за сериализиране.“

„В ред 5 ние сериализираме objectOriginal в byteов масив с помощта на outputStream и го запазваме в writeBuffer .“

"В ред 8 преобразуваме writeBuffer в обикновен byteов масив. По-късно ще" прочетем "новия ни обект от този масив."

„В ред 9 трансформираме буфера в ByteArrayInputStream , за да четем от него като InputStream.“

„В ред 10 предаваме readBuffer на конструктора ObjectInputStream , за да прочете (десериализира) обекта.“

„В ред 11 четем нашия обект и го конвертираме в BigObject .

"Какво мислиш?"

"Красиво е."

„И между другото, когато codeът е подчертан в различни цветове, е много по-лесно за разбиране.“