2016-06-03 3 views
1

readResolve는 deserialize 된 객체의 생성/반환을 처리하는 후크입니다. Singleton 클래스가 여러 개의 비 직렬화 후에도 하나의 객체 만 갖도록 보장하면서 사용할 수 있습니다. 그러나이 메소드는 인스턴스 메소드이며 객체가 직렬화 해제되는 클래스에 정의됩니다. 그렇다면이 메소드가 어떻게 처음부터 호출됩니다. 다른 기능이 관련되어 있습니까?`readResolve`가 호출 객체를 반환하면 어떻게 인스턴스 메소드가됩니까?

답변

0

개체 비 직렬화가 역 직렬화 된 다음 에 의해 실제로 반환되는 개체를 결정하기 위해 해당 readResolve() 메서드가 호출됩니다. 이 클래스는 같은 클래스의 싱글 톤 인스턴스를 대체하는 것처럼 사용할 수도 있고 완전히 다른 클래스의 인스턴스를 반환하는 데 사용할 수도 있습니다. 예를 들어 해당 writeObjext() 메서드가 직렬화 할 프록시 개체를 대체 한 경우입니다.

1

오해하셨습니까? (De) 직렬화는 바이트로부터 객체를 생성 한 다음,이 객체에 대체 할 것인지를 묻습니다.

private Object readResolve() { 
    return this; 
} 

은이 방법을 구현하는 완벽한 방법입니다. 그것은 "나를 대체하지 말라"는 의미이기 때문에 단지 무의미합니다. 이 방법이 없을 때도 똑같은 일이 일어난다.


당신이

class Elvis implements Serializable { 
    { System.out.println("Initializer of " + this); } 
    private Elvis() { System.out.println("Constructor of " + this); } 

    static final Elvis THE_ELVIS = new Elvis(); 

    private Object readResolve() { 
     System.out.println("readResolve of " + this); 
     new Exception("This is how we get called:").printStackTrace(); 
     return THE_ELVIS; // we're not the real one and don't want to be 
          // the result of deserialization. Replace with 
          // proper instance. 
    } 
} 

http://ideone.com/kd2PdS

다음 역 직렬화 할 때가 볼 수 있도록 할 수 있습니다
관련 문제