마커 인터페이스는 인터페이스와 클래스를 연결할 수 있는 런타임 유형 검사 기능이 포함된 디자인 패턴입니다. 이것이 필요한 이유를 이해하려면 Serializible 클래스를 마커로 표시하는 예를 고려하십시오. 객체의 상태를 메모리에 저장한 다음 저장한 내용을 해독할 수 있어야 한다고 가정해 보겠습니다. 그런 다음 개체를 비트 집합으로 변환할 수 있다고 말씀하셨습니다. 오른쪽. FileInputStream을 사용하여 파일에 쓰는 간단한 방법을 사용할 수 있지만 이는 개체가 적을 때만 편리하지만 개체가 많으면 어떻게 될까요? 이를 위한 훌륭한 직렬화 도구가 있습니다. 이를 사용할 때의 주요 규칙은 직렬화되는 개체가 모든 데이터를 포함해야 하며 다른 개체를 참조해서는 안 된다는 것입니다. 클래스를 보세요. "아하, 필드가 참조되지 않고 직렬화 가능 마커를 넣는 것이 좋습니다." 그리고 이를 넣으면 표시한 개체가 ObjectOutputStream에 기록될 수 있음을 의미합니다. ObjectOutputStream 클래스에는 writeObject0() 메서드가 있으며, 여기에는 객체를 쓸 수 있는지 여부를 확인하는 검사 인스턴스가 포함되어 있으며, 전체 검사가 실패하면 NotSerializedException 예외가 발생하고, 그렇지 않은 경우 모든 것이 깔끔하게 메모리에 기록됩니다. 직렬화할 인스턴스인 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 클래스는 이미 직렬화 가능으로 표시되어 있습니다. 여기에는 하나의 ID 필드와 함께 제공되는 get/set 메소드가 있습니다. 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