이 글에서는 주로 Java의 직렬화 및 readResolve() 메소드에 대한 자세한 설명을 소개합니다. 이 부분의 지식을 이해하는 데 도움이 되는 예는 다음과 같습니다. 필요한 친구는 Java의 직렬화 및 readResolve()를 참조할 수 있습니다. 메소드 예시 설명
readResolve 메소드의 기능은 무엇인가요? 이 메소드는 객체의 직렬화와 관련이 있습니다(이것은 readResolve 메소드가 비공개적으로 수정되는 이유를 설명합니다). 객체 직렬화와 어떤 관련이 있나요?
다음으로 객체 직렬화에 대해 간략하게 살펴보겠습니다. 일반적으로 말해서 클래스가 직렬화 가능 인터페이스를 구현하는 경우 이를 메모리에 쓰고 메모리에서 읽어 원본과 정확히 동일한 객체로 "어셈블"할 수 있습니다. 그러나 직렬화에서 싱글톤을 발견하면 문제가 발생합니다. 메모리에서 읽고 조립한 객체가 싱글톤의 규칙을 위반합니다. 싱글톤에는 JVM에서 하나의 클래스 객체만 필요하지만 이제 역직렬화를 통해 새 객체가 복제됩니다. 다음 예와 같이 Java 코드:public final class MySingleton implements Serializable { private MySingleton() { } private static final MySingleton INSTANCE = new MySingleton(); public static MySingleton getInstance() { return INSTANCE; } }
MySingleton 객체(getInstance 메소드를 통해 얻은 싱글톤 객체)를 직렬화한 후 메모리에서 읽어오면 새로운 객체가 생기지만 동일합니다. MySingleton 개체가 원래대로 존재합니다. 그러면 싱글톤 모드를 유지하려면 readResolve 메소드를 사용해야 합니까? 아래와 같이:
public final class MySingleton implements Serializable{ private MySingleton() { } private static final MySingleton INSTANCE = new MySingleton(); public static MySingleton getInstance() { return INSTANCE; } private Object readResolve() throws ObjectStreamException { // instead of the object we're on, // return the class variable INSTANCE return INSTANCE; } }
이러한 방식으로 JVM이 메모리에서 새 개체를 역직렬화하고 "어셈블"할 때 자동으로 readResolve 메서드를 호출하여 우리가 지정한 개체를 반환하며 싱글톤 규칙도 다음과 같습니다. 그것은 보장되었습니다.
위 내용은 Java의 직렬화 및 readResolve() 메소드 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!