2012-10-27 3 views
1

코드에 직렬화를 시도하고 구현하기위한 간단한 글을 읽었습니다.자바에서 객체 직렬화하기

기본적으로 Test 클래스에는 Questions이 들어 있습니다. 가능한 한 한 번에 전체 Test 개체를 직렬화하거나 각 개체가 아닌 경우 Question을 직렬화하려고합니다. 지금은 각각 Question을 해보려고합니다.

public abstract class Question implements Serializable { 
    ... 
} 

public class Test { 

... 

public void save() { 
    try { 

     System.out.print("File name will be saved.ser: "); 

     FileOutputStream fileOut = new FileOutputStream("saved.ser"); 

     ObjectOutputStream out = new ObjectOutputStream(fileOut); 

     for (Question question : questionList) { 
      out.writeObject(question); 
     } 

     out.close(); 
     fileOut.close(); 

    } catch(IOException i) { 
     i.printStackTrace(); 
    } 
} 

그리고 다음이 오류가 있습니다 :

java.io.NotSerializableException: java.util.Scanner 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at main.Survey.save(Survey.java:129) 
    at main.MainDriver.main(MainDriver.java:59) 

하지 Question의 모든 개체가 Serializable를 구현하는 문제인가? 그것도 끝내야합니까? 그것은 매우 지루하게 보일지라도, 필요한 경우 그것을 할 것입니다. 하위 클래스를 포함하여 Question에서 사용하는 모든 클래스에 해당 인터페이스를 제공해야합니까?

또한 내 기본 방법으로 전체 Test 개체를 직렬화하는 것이 더 좋을까요?

+0

질문 클래스 전체 코드 입력 –

답변

3

Is the problem that not every object in Question implements Serializable? Does that need to be done as well?

예, 직렬화가 가능한 클래스의 모든 멤버도 직렬화 가능해야합니다.

Do all of my classes that are used by Question, including it's subclasses, need to be given that interface?

아니요, 수퍼 클래스가 serializable이면 모든 하위 클래스도 암시 적으로 직렬화 가능합니다. 따라서 하위 클래스를 명시 적으로 다시 직렬화 가능으로 표시 할 필요가 없습니다.

귀하의 경우에는 스캐너 객체가 클래스 멤버 일 필요는없고 입력을 읽는 로컬 변수가 될 수 있다고 생각합니다. Scanner 객체가 여전히 멤버 변수 여야하는 경우 으로 선언하여 직렬화 및 비 직렬화 프로세스 중에 무시됩니다.

+0

답변 해 주셔서 감사합니다. 그렇게 된 것 같습니다! – iaacp

2

java.util.Scanner는 Serializable 인터페이스를 구현하지 않습니다. Scanner 인스턴스 필드를 포함하는 클래스에서 필드를 일시적으로 선언해야합니다.

클래스 인스턴스 변수에서이를 생략하고 메소드에서 로컬로 사용하는 것이 좋습니다. 이런 방식으로 클래스에서 일시적으로 표시하지 않아도됩니다. Java 사양의 작성자는 어떤 클래스가 직렬화 가능 여부를 지정합니다. Integer, Float, ...와 같은 래퍼 클래스와 ArrayList, HashMap 같은 컬렉션 클래스 ... java.io.Serializable 인터페이스를 구현합니다. Scanner 클래스는 Java 사양 작성자의 관점에서 Serializable이 아닙니다. 그로부터 어떤 클래스를 직렬화 할 수 있는지 결정할 수 있습니다.

+0

스캐너는 몇 개의 다른 장소에서 사용됩니다. 질문에 하나, 시험에 하나, 그리고 마인에 하나씩 있습니다. 질문에 포함 된 개체도 있습니다. 나는 질문에서 그것을 할 필요가 있을까요? – iaacp

+0

@iaacp 모든 직렬화 가능 클래스에서 일시적으로 변경해야합니다. 그것이 회원 분야가되어야하는지 의문입니다. 주로 이러한 것들이 지역 변수로 사용됩니다. – EJP