2014-07-07 6 views
7
나는 다음과 같은 라인을 찾을 수있는 인터페이스 Serializable의 문서, 읽고있다

: 직렬화되는하위 클래스가 Serializable을 구현하는 경우 기본 클래스 (Serializable을 구현하지 않음)에 인수 생성자가 없어야하는 이유는 무엇입니까?

비 직렬화 가능 클래스의 서브 타입을 허용하려면, 하위 유형은 저장하고 상태를 복원에 대한 책임을 가정 할 수 supertype의 public, protected 및 (액세스 가능한 경우) 패키지 필드 아류 형은 그것이 확장 한 클래스가 클래스의 상태를 초기화하기 위해 접근 할 수있는 인수없는 생성자를 갖는 경우에만이 책임을 맡을 수 있습니다. 이러한 경우가 아니라면 Serializable 클래스를 선언하는 것은 오류입니다. 런타임에 오류가 감지됩니다.

하지만 객체의 상태를 복원 할 때 기본 클래스의 인수가없는 생성자의 역할은 무엇입니까?

+0

http://www.jguru.com/faq/view.jsp?EID=251942를 참조하십시오. – GKislin

답변

13

직렬화 가능 객체를 직렬화 해제하려고하면 객체의 빈 인스턴스가 만들어지고 구성원을 채워 직렬화 될 때의 상태로 객체를 복원해야합니다. 직렬화 가능 객체의 생성자는 객체가 처음 생성 될 때 호출되지만, 기술적으로는 객체를 생성하지 않고 이전 상태로 다시 구성하기 때문에 직렬화 변환 중에 생성자가 호출되지 않습니다. 구성 및 서브 시퀀스 조작의 효과는 이미 오브젝트 상태에 통합 될 것으로 예상됩니다.

어떤 클래스의 객체를 구성 할 때마다 Java는 수퍼 클래스 및 수퍼 수퍼 클래스 등의 생성자를 호출해야합니다. super(...)을 사용하거나 수퍼 클래스가 아닌 경우 수퍼 클래스에 대해 특정 생성자를 지정할 수 있습니다. 슈퍼 생성자를 지정하지 않으면 기본 생성자가 사용됩니다. 어떤 방법 으로든 루트에 대한 모든 클래스가 구성됩니다. serlializable 객체의

역 직렬화는 생성자 호출을 유발하지 않지만, 직렬화 가능하지 않은 슈퍼 클래스가있을 때 그 클래스에 기대되지 않는다 (즉, 당신이 직렬화 클래스와 직렬화 클래스를 확장 입니다) 역 직렬화되어야하며 멤버를 저장/복원 할 수있는 메커니즘이 없습니다. 슈퍼 클래스가 직렬화 가능하지 않은 경우, 직렬화 복원 메커니즘은 제로 인수 생성자를 호출하여 재구성 된 객체 인스턴스가 올바르게 초기화되었는지 확인해야합니다.

인수가없는 생성자를 지정하지 않은 경우 deserialization 코드는 해당 클래스의 개체를 deserialize하기 전까지이 문제를 경고하지 않습니다. 컴파일시에는 경고가 없습니다.

또한 serializable 하위 클래스는 직렬화 불가능한 수퍼 클래스의 멤버 값을 저장/복원해야합니다.

+0

기본 클래스의 생성자가 항상 직렬화로 실행됩니까? – YakRangi

+0

수퍼 클래스가 serializable이면 arg 생성자가 필요하지 않습니다. 파생 클래스 객체는 해당 부분이 serializable이므로 자동으로 기본 클래스 부분을 저장하기 때문에 serialization이 가능하지 않습니다.] – YakRangi

+0

기본 클래스에 arg가없는 arg 생성자가 직렬화 가능하지 않으면 둘 다 호출되는 것입니까? – YakRangi

0

수퍼 클래스가 서브 클래스의 객체를 직렬화하는 것보다 직렬화되지 않는 경우에는 명시 적으로 서브 클래스에 직렬화 가능 인터페이스를 구현해야합니다. 이 경우 수퍼 클래스에는 인수가없는 생성자가 있어야합니다.

수퍼 클래스가 Serializable이 아니면 수퍼 클래스에서 상속 된 인스턴스 변수의 모든 값은 비 직렬화 수퍼 클래스의 생성자를 호출하여 초기화됩니다.

관련 문제