직렬화 - Serialization
- 자바의 상태를 바이트 스트림으로 변환하는 것
- 자바 객체를 정적인 바이트 스트림으로 변환하는 것 - 파일 / 데이터베이스에 저장하거나 네트워크를 통해 전송 가능
바이트 스트림(byte stream)
- 컴퓨터에서 데이터를 읽고 쓸 수 있는데 사용하는 기본 방식
직렬화 장점
- 객체 저장 - 객체를 파일로 저장하거나 네트워크를 통해 전송할 수 있음
- 객체 전송 - 네트워크를 통해 전송할 수 있어, 다른 컴퓨터나 애플리케이션과 객체 공유 가능
- 객체 복원 - 직렬화된 객체는 복원할 수 있어, 객체의 상태를 유지할 수 있음
- 분산 환경 - RMI(Remote Method Invocation)나 EJB(Enterprise JavaBeans)를 사용하는 분산 환경에서 사용 가능
직렬화 단점
- 보안 - 네트워크를 통해 전송될 때 보안이 취약할 수 있음
- 성능 - 직렬화에는 성능 비용이 발생할 수 있고 직렬화된 개체의 크기도 증가할 수 있음
- 버전관리 - 클래스의 정의가 변경될때 호환되지 않아 이전 버전과의 호환성 유지가 어려움
- 사용제한 - 직렬화는 자바 클래스를 기반으로 하는 객체만 직렬화하고 데이터 구조나 원시 유형과 같은 다른 유형은 직렬화하지 않는다.
- 장황함 - 객체의 직렬화된 형태는 상당히 장황할 수 있고 많은 공간을 차지할 수 있으므로 네트워크를 통해 전송하거나 메모리에 저장하는 것이 어렵다.
예시
- 직렬화
class Person implements Serializable {
private String name;
private int age;
//getter and setter and toString
}
public class Serializable {
public static void main(String[] args) {
// 객체 선언
Person person = new Person("David",10);
//자바 7 이전 버전 try-catch-final
FileOutputStream fileOut = null;
ObjectOutputStream out = null;
try {
fileOut = new FileOutputStream("person.txt");
out = new ObjectOutputStream(fileOut);
out.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 자바 7 이후 try-catch-resource문
try (
// 여기서 선언한건 사용이 끝나면 닫아줌
FileOutputStream fileOut = new FileOutputStream("person.txt");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
) {
out.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
}
}
바이트 코드라서 속 내용은 읽은 수 없는 문자로 되어있음
- 역직렬화
public class Deserializable {
public static void main(String[] args) {
try {
FileInputStream fileIn = new FileInputStream("person.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person person = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println(person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
저장된 객체를 가져와서 사용(출력)
참고