Ang mga interface ng marker ay isang pattern ng disenyo na may pagsuri sa uri ng run-time na nagbibigay-daan sa iyong mag-ugnay ng isang interface at isang klase. Upang maunawaan kung bakit maaaring kailanganin ito, isaalang-alang ang isang halimbawa ng pagmamarka sa Serializible na klase gamit ang isang marker. Ipagpalagay natin na kailangan nating i-save ang estado ng isang bagay sa memorya, at pagkatapos ay ma-decrypt din ang na-save natin. Pagkatapos, sasabihin mo, maaari naming i-convert ang aming bagay sa isang hanay ng mga bit. Tama. Maaari tayong gumamit ng simpleng paraan ng pagsulat sa isang file gamit ang FileInputStream, ngunit ito ay maginhawa lamang kung kakaunti ang mga bagay, ngunit paano kung marami sa kanila? Mayroong isang kahanga-hangang tool sa serialization para dito. Ang pangunahing panuntunan kapag ginamit mo ito ay ang bagay na ini-serialize ay dapat maglaman ng lahat ng data at hindi sumangguni sa iba pang mga bagay. Tingnan ang iyong klase "Aha, ang mga field ay hindi naka-reference at magandang ilagay ang Serializable marker." At kapag inilagay mo ito, ito ay nangangahulugan na ang mga bagay na iyong minarkahan ay maaaring isulat sa ObjectOutputStream. Ang klase ng ObjectOutputStream ay may writeObject0() na paraan, at naglalaman ito ng mga instanceof checks na nagsusuri kung ang object ay maaaring isulat at kung ang buong serye ng mga tseke ay nabigo, pagkatapos ay isang NotSerializableException exception ang itatapon, at kung hindi, lahat ay maayos na nakasulat sa memorya. Gumawa tayo ng klase ng BigObject, ang mga pagkakataon kung saan ise-serialize natin.
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; } }
Ang klase ng BigObject ay minarkahan na bilang Serializable. Mayroon itong isang field ng id at kasamang get/set method. 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"); } }
GO TO FULL VERSION