직렬화 프록시 패턴을 사용하는 경우 writeObject
포함하는 클래스에 대한 사용자 지정 메서드를 제공해야합니까 , 아니면 프록시 만 제공해야 합니까? 프록시에 대해 사용자 지정 양식을 사용해야합니까? Serialization에 대한 Effective Java의 장을 읽었지만 사용자 정의 양식과 프록시 패턴에 대해서는 명확하지 않았습니다.
직렬화 프록시 패턴을 사용할 때 원래 클래스의 인스턴스는 "일반"직렬화 메커니즘을 사용하여 직렬화되지 않습니다. 따라서 원래 클래스에 writeObject
구현이 있으면 호출되지 않습니다.
writeObject
메서드 가 필요하지는 않지만 readObject
원래 클래스에 메서드를 작성해야합니다 . 프록시를 도입하기 전에 직렬화 된 경우 클래스의 이전 직렬화 된 인스턴스가 외부에있을 수 있습니다. 또는 누군가가 원래 클래스의 일반적인 직렬화 된 형식 처럼 보이는 바이트 스트림을 위조했을 수 있습니다 . 이것을 역 직렬화하면 프록시를 우회하고 원래 클래스의 잘못된 인스턴스를 만들 수 있습니다. 이를 방지하려면 readObject
원래 클래스 의 메서드 에서 무조건 예외를 throw하여 역 직렬화가 프록시를 우회하지 않도록합니다. (이는 Effective Java에 언급되어 있지만 여기서 반복해야한다고 생각하는 것이 중요합니다.)
직렬 프록시의 사용자 지정 형식의 경우 반드시 필요한 것은 아닙니다. 효과적인 Java 는 직렬 프록시 클래스가 기본 직렬 형식을 사용할 수있을만큼 간단하고 명확하게 설계 될 것을 제안합니다. 이것이 효과가 있다면 기본 양식을 사용할 수 있습니다. 그러나 내가보기 시작한 또 다른 패턴은 단일 직렬화 프록시가 여러 직렬화 가능 클래스의 프록시로 사용되는 경우입니다. 이 경우 프록시 클래스는 중첩 클래스가 아니라 동일한 패키지의 패키지 전용 클래스입니다. 프록시는 프록시 인 클래스에 따라 작성되는 직렬화 된 데이터를 변경할 수 있도록 사용자 정의 직렬화 된 양식을 원할 것입니다.
java.time
JDK에서 새 클래스 의 직렬화는 여러 데이터 클래스에 대한 단일 직렬 프록시를 사용하여이를 수행합니다. 참고 항목 Ser.java의 이 작업을 수행하는 방법을보기 위해 파일을. 그러나 이것은 Externalizable
특별한 직렬화 메서드 대신 인터페이스를 사용 하고 읽기 및 쓰기를 수행하기 위해 데이터 클래스에 다시 위임하기 때문에 조금 더 복잡 합니다. 그러나 직장에서 원칙을 볼 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다