객체 직렬화(Object Serialization), 객체 역직렬화( Object Deserialization)

기록하는 용도·2022년 8월 24일
0

객체 직렬화(Object Serialization)

메모리 상에 있는 자바 객체를 외부로 전송할 수 있는 상태로 만드는 것

객체 직렬화를 위해서는 (=해당 클래스로부터 생성된 객체가 외부로 전송되기 위해서는) 반드시 implements Serializable을 해야한다.



객체 직렬화 관련 Processing 스트림

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을 생성하는 것이다.



객체 역직렬화(Object Deserialization)

외부에 있는 객체의 정보를 메모리로 다시 복원하는 것



객체 역직렬화 관련 Processing 스트림

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();
		}
	}
}


직렬화 예제에서 파일에 저장된 정보를 다시 역직렬화하여 메모리로 복원된 것을 확인 할 수 있다.

0개의 댓글