2011-12-25 2 views
28

은 바 푸를 확장하고 푸 Serializable를 구현하지 않습니다 Serializable자바 객체 직렬화 및 상속

class Foo { 

public String name; 

public Foo() { 
    this.name = "Default"; 
} 

public Foo(String name) { 
    this.name = name; 
} 
} 

class Bar extends Foo implements java.io.Serializable { 

public int id; 

public Bar(String name, int id) { 
    super(name); 
    this.id = id; 
} 
} 

공지 사항을 구현하는이 두 클래스, 푸와 바 말해봐. bar가 직렬화되면 어떻게 될까요?

public static void main(String[] args) throws Exception { 

    FileOutputStream fStream=new FileOutputStream("objects.dat"); 
    ObjectOutputStream oStream=new ObjectOutputStream(fStream); 
    Bar bar=new Bar("myName",21); 
    oStream.writeObject(bar); 

    FileInputStream ifstream = new FileInputStream("objects.dat"); 
    ObjectInputStream istream = new ObjectInputStream(ifstream); 
    Bar bar1 = (Bar) istream.readObject(); 
    System.out.println(bar1.name + " " + bar1.id); 

} 

"기본값 21"이 인쇄됩니다. 질문은 클래스가 직렬화되지 않을 때 기본 생성자가 호출되는 이유는 무엇입니까?

+1

생성자를 호출하지 않고 무해한 클래스의 인스턴스를 갑자기 만들 수 없으므로 직렬 사양에서 직렬 처리가 불가능한 클래스의 생성자를 호출해야합니다./직렬 프록시를 원할 수도 있습니다. –

답변

20

Serializable은 주어진 클래스에 대한 "마커 인터페이스"입니다.

하지만 클래스는 특정 규칙을 준수해야합니다

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html

, 비 직렬화 가능 클래스의 서브 타입은 직렬화 할 수 있도록 저장 및 상태 복원에 대한 책임을지지 수 하위 유형 슈퍼 타입의 public, protected 및 (접근 할 수있는 경우) 패키지 필드. 서브 타입은 클래스가 extends 클래스의 상태를 초기화하기 위해 접근 할 수있는 인수없는 생성자를 갖는 경우에만이 책임을 맡을 수 있습니다. 이 이 아닌 경우 Serializable 클래스를 선언하면 오류가 발생합니다.

는 @Sleiman Jneidi 질문은 오라클 문서에 는, 위에서 언급 한, 코멘트에서 질문에 대답은 명확

직렬화 복원시에 언급, 비 직렬화 가능 클래스의 필드는 공공 또는 보호를 사용하여 초기화됩니다 클래스의 인수없는 생성자. 인수가없는 생성자는 직렬화 가능한 서브 클래스에 액세스 할 수 있어야합니다. 직렬화 가능 서브 클래스의 필드는 스트림로부터 복원됩니다.

따라서 Foo 클래스의 기본 무안 인수 생성자는 초기화를 초래했습니다.

+0

나는 그것을 안다. 하지만 기본 생성자를 호출하는 이유. Serializable이 무엇인지 묻지 않습니다. –

+5

@sleimanjneidi "직렬화 할 수없는 클래스의 부속 유형을 직렬화하려면 해당 하위 유형이 상위 유형의 공용, 보호 및 액세스 가능한 패키지 필드 **"의 상태 저장 및 복원에 대한 책임을 져야 할 수 있습니다. 이것은'Foo'가 직렬화 가능하지 않기 때문에'Foo'의'name' 필드를'손으로 "설정해야 함을 의미합니다. – fge

4

the defaultWriteObject can only write the non-static and non-transient fields of the current class 일 수 있습니다. 수퍼 클래스가 Serializable 인터페이스를 구현하지 않으면 수퍼 클래스의 필드를 스트림으로 직렬화 할 수 없습니다.

+0

예, 수퍼 클래스가 Serializable을 구현하지 않으면 직렬화되지 않을 것입니다. 따라서 직렬화되지 않을 때 기본 생성자 이 호출되고 기본값은 모든 변수에 할당됩니다. – Akash5288

0

실제로 부모 클래스 객체를 다시 읽을 때 직렬화되지 않습니다. 따라서 비 직렬화 작업을 위해 JVM은 새 키워드를 사용하여 새 객체를 만들 때 사용하는 것과 동일한 프로세스를 거칩니다.