Java 객체 직렬화 쓰기/읽기 테스트
아래 예제는 ObjectOutputStream으로 문자열과 Date 객체를 파일에 직렬화해 저장하고, 다시 ObjectInputStream으로 읽어 오는 간단한 테스트입니다. 직렬화된 파일은 일반 텍스트가 아니라 바이너리 형식이므로, vi 같은 편집기로 열면 사람이 읽기 어려운 문자들이 보이는 것이 정상입니다.
1. serialWriteTest
import java.io.*;
import java.util.*;
class serialWriteTest
{
public static void main(String args[])
{
try
{
FileOutputStream fos = new FileOutputStream("test.txt");
ObjectOutput oo = new ObjectOutputStream(fos);
oo.writeObject("Serial Write Test!");
oo.writeObject(new Date());
oo.flush();
oo.close();
}
catch(Exception e) {
e.printStackTrace();
}
System.out.println("Serial Write Test!");
System.out.println(new Date());
}
}
원래 코드에서는 ObjectOutput 객체를 oo라는 이름으로 만들었지만, 실제로는 s.writeObject()를 호출하고 있었습니다. 컴파일되도록 oo.writeObject()로 수정해야 합니다.
컴파일 후 실행합니다.
# javac serialWriteTest.java # java serialWriteTest Serial Write Test! Tue Sep 16 18:25:32 KST 2014 # vi test.txt ¬i^@^Et^@^RSerial Write Test!sr^@^Njava.util.Datehj<81>^AKYt^Y^C^@^@xpw^H^@^@^AH}Cy<86>x
2. serialReadTest
import java.io.*;
import java.util.*;
class serialReadTest
{
public static void main(String args[])
{
try
{
FileInputStream fis = new FileInputStream("test.txt");
ObjectInput oi = new ObjectInputStream(fis);
System.out.println((String)oi.readObject());
System.out.println((Date)oi.readObject());
oi.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
직렬화된 객체를 읽을 때는 쓴 순서와 같은 순서로 읽어야 합니다. 위의 쓰기 예제에서 문자열을 먼저 쓰고 Date 객체를 그다음에 썼으므로, 읽기 예제에서도 String, Date 순서로 읽습니다.
컴파일 후 실행합니다.
# javac serialReadTest.java # java serialReadTest Serial Write Test! Tue Sep 16 18:25:32 KST 2014