메모리 상에 있는 자바 객체를 외부로 전송할 수 있는 상태로 만드는 것
객체 직렬화를 위해서는 (=해당 클래스로부터 생성된 객체가 외부로 전송되기 위해서는) 반드시 implements Serializable을 해야한다.
ObjectOutputStream
writeObject(Object)
직렬화(객체를 외부로 전송)를 위해서는 ObjectOutputStream을 사용한다.
파일에 객체를 직렬화 하는 코드는 다음과 같다.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeObject(car);
이 코드를 조금 풀어쓴다면 다음과 같다.
FileOutputStream fos = new FileOutputStream(filePath);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(car);
ObjectOutputStream은 각각 기반 스트림을 필요로 하는 보조 스트림이다. 그래서 객체를 생성할때 직렬화할 스트림을 정해주어야한다.
이 코드는 filePath 경로에있는 car 객체를 직렬화하여 저장한다.
출력할 FileOutputStream을 생성해서 이를 기반 스트림으로 하는 ObjectOutputStream을 생성하는 것이다.
외부에 있는 객체의 정보를 메모리로 다시 복원하는 것
ObjectInputStream
readObject(): Object
직렬화와는 달리 readObject()를 사용해 저장된 데이터를 읽고 객체로 역직렬화한다. 다만 readObject()의 반환타입은 Object, 즉 객체 타입이기때문에 객체 원래의 타입으로 형변환 해주어야한다.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
Car car = (Car)ois.readObject(); //return type이 Object
import java.io.Serializable;
public class Car implements Serializable {
// implements Serializable하는 순간 외부로 나갈 수 있음
private static final long serialVersionUID = -8837562511732867137L;
private String model;
private int price;
public Car(String model, int price) {
super();
this.model = model;
this.price = price;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
Car 클래스로부터 생성된 객체가 직렬화 되기 위해서는 implements Serializable 해야한다.
만약 Serializable 인터페이스 계층 구조하에 있지 않으면 java.io.NotSerializableException이 발생되고 외부로 전송되지않는다.
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import common.Path;
public class TestObjectOutput {
public static void main(String[] args) {
Car car = new Car("sm6", 3000);
String filePath = Path.TEST_DIR + "car.obj";
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(new FileOutputStream(filePath));
oos.writeObject(car);
oos.close();
System.out.println("객체 직렬화하여 Car 객체를 파일에 전송");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
파일 경로에 객체가 전송된 것을 볼 수 있다.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import common.Path;
import step6.Car;
public class TestObjectInput {
public static void main(String[] args) {
String filePath = Path.TEST_DIR + "car.obj";
ObjectInputStream ois;
try {
ois = new ObjectInputStream(new FileInputStream(filePath));
Car car = (Car)ois.readObject();
System.out.println(car.getModel() + " " + car.getPrice());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
직렬화 예제에서 파일에 저장된 정보를 다시 역직렬화하여 메모리로 복원된 것을 확인 할 수 있다.