객체를 직렬화하여 객체째로 파일이나 네트워크에 입출력할 수 있게 해준다.
객체 직렬화는 객체를 바이트 형태로 바꿔 스트림을 통해 입출력할 수 있게 만들어 주는 것을 말한다.
사용하려면 클래스에 Serializable 인터페이스를 구현해주어야 한다. 참고로 빈 인터페이스로 implements만 해주면 된다.
import java.io.*;
public class WriteObject {
public static void main(String[] args) {
// 직렬화할 객체 (Serializable 인터페이스 구현 필요)
MyObject obj = new MyObject("자바", 2025);
try (FileOutputStream fos = new FileOutputStream("object.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
// 객체를 파일에 쓴다
oos.writeObject(obj);
System.out.println("객체가 파일에 성공적으로 저장되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 반드시 Serializable 인터페이스를 구현해야 함
class MyObject implements Serializable {
private String name;
private int year;
public MyObject(String name, int year) {
this.name = name;
this.year = year;
}
// getters (생략 가능)
@Override
public String toString() {
return "이름: " + name + ", 년도: " + year;
}
}
import java.io.*;
public class ReadObject {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("object.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
// 파일에서 객체를 읽어온다
MyObject obj = (MyObject) ois.readObject();
System.out.println("파일에서 읽어온 객체: " + obj);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
다른 보조 스트림과 마찬가지로 각각 스트림에 연결시켜주면 된다.그런 다음 read/writeObject 입출력 해준다.
한 객체뿐만 아니라 리스트로 저장된 객체들을 한 번에 직렬화/역직렬화시켜 입출력할 수 있다.
좋아 보이는 기능이지만 요즘에는 안 쓰이는 기능이다. 유연성이나 너무 무거운 등 여러 가지 문제점이 발생하기 때문이다. 따라서 요즘에는 복잡하고 무거운 xml을 거쳐 json을 데이터 보내거나 가져올 때의 포맷으로 많이 쓴다. json은 정말 간단하고 유연하게 사용할 수 있다.게다가 다른 언어와의 호환성도 좋다.여기서 더욱 성능을 좋게 만들고 싶으면 Protobuf, Avro 사용하면 된다.