2012년 11월 5일 월요일

OCJP 문제풀이 - Question 34


QUESTION 34
Click the Exhibit button.
Which code, inserted at line 14, will allow this class to correctly serialize and deserialize?

import java.io.*;
public class Foo implements Serializable {
  public int x, y;
  public Foo(int x, int y){
    this.x = x; this.y = y;
  }

  private void writeObject(ObjectOutputStream s)
    throws IOException{
    s.writeInt(x); s.writeInt(y);
  }

  private void readObject(ObjectInputStream s)
    throws IOException, ClassNotFoundException {
    //insert code here
  }
}

A. s.defaultReadObject();
B. this = s.defaultReadObject();
C. y = s.readInt(); x = s.readInt();
D. x = s.readInt(); y = s.readInt();

Answer: D
Section: All

Explanation/Reference:

  예제 소스에서는 Foo 의 필드변수 x와 y를 ObjectOutputSream 을 통해서 output stream에 변수를 쓰고, ObjectInputStream 을 통해서 input stream 의 내용을 읽는다.

ObjectInputStream 내용을 읽어서 Foo 클래스에 제대로 반영하려면, writeInt를 통해 outStream에 뿌려진 int형 자료를 readInt 로 받아서 각 변수에 셋팅하여야 한다.


defaultReadObject() 라는 함수는 기본적으로 쓰여진 스트림 정보를 읽는데에 사용한다. 즉 defaultWriteObject() 를 이용하여 쓰여진 정보를 읽는데 사용하는 것이다. 위 예제에서는 object의 내용을 쓰는데, defaultWriteObject() 메소드를 사용하지 않았으므로 오답니다.