본문 바로가기

프로그래밍언어/JAVA

[JAVA] Serialization & Deserialization

반응형

1. Serialization & Deserialization

자바 직렬화, Serialization 이란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술이다. 이와 반대되는 기술로 바이트로 변환된 데이터를 다시 객체로 변환하는 기술을 역직렬화, Deserialization 이 있다.

시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기한다.

- Serialization

자바에서 직렬화는 객체를 직렬화하여 전송 가능한 형태로 만드는 것이다. 객체들의 데이터를 연속적인 형태로 변형하여 Stream 을 통해 데이터를 읽을 수 있는 형식으로 만든다. 주로 객체를 통째로 파일로 저장하거나 전송하고 싶을 때 사용한다.

자바 객체를 직렬화 할 때는 java.io.ObjectOutputStream 객체를 이용한다.

 

// SerializableClass 타입의 객체를 직렬화 한다.
SerializableClass obj = new Serializable

// 직렬화 된 내용을 Serialization.out 파일에 저장한다.
try(ObjectOutput out = new ObjectOutputStream(new FileOutputStream("Serialization.out"))) {
	out.writeObject(obj);
}


- Deserialization

역직렬화는 직렬화 된 파일을 다시 객체의 형태로 만드는 것을 말한다. 저장된 파일을 읽거나 전송된 스트림 데이터를 읽어와서 원래 객체의 형태로 복원한다.

 

// Serialization.out 파일에 직렬화 된 내용을 읽어와서 역직렬화한다.
SerializableClass deserializedObj;
try(ObjectInput in = new ObjectInputStream(new FileInputStream("Serialization.out"))) {
	deserializedObj = (SerializableClass) in.readObject();
}

 

 

2. Serializable

자바에서 객체를 직렬화를 하기 위해서는 해당 객체의 타입 클래스가 직렬화가 가능한 클래스이어야 한다. 클래스를 직렬화가 가능하도록 선언하기 위해서는 Serializable 인터페이스를 구현하거나, Serializable 인터페이스를 구현한 클래스를 상속받으면 된다. 위의 직렬과, 역직렬화 예제의 코드가 정상으로 수행되기 위해서는 아래와 같이 SerializableClass 클래스가 Serializable 인터페이스를 구현해야 한다.

 

// Serializable 인터페이스를 implements 하여 직렬화가 가능한 클래스
public class SerializableClass implements Serializable {
  public void method() {
    ...
  }
}

// Serializable 인터페이스를 implements 한 클래스를 상속받아 직렬화가 가능한 클래스
public class SerializableInheritClass extends SerializableClass {
  ...
}


- trasient

직렬화가 가능한 클래스에 포함된 멤버변수 전체가 직렬화의 대상이 된다. 하지만 보안 상의 이유 등으로 멤버변수 일부를 제외하고 싶은 경우에는 transient 를 사용하여 지정할 수 있다.

 

// attr1 은 직렬화 되지만, attr2 는 직렬화 되지 않는다.
public class SerializableClass implements Serializable {
  private int attr1;
  private transient int attr2;
}

 

- 객체 멤버변수

만약 클래스의 멤버변수 중에 기본 자료형 타입이 아닌 객체 참조형 타입이 있는 경우에는 어떻게 될까? 이때는 해당 객체 타입을 확인해야 한다. 객체 참조형 멤버변수 중에 객체의 클래스 타입이 Serializable 하지 않으면 해당 클래스 타입은 직렬화 할 수 없다.



[reference]
https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization
https://devlog-wjdrbs96.tistory.com/26
https://techblog.woowahan.com/2550/

반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] Calendar & Date  (0) 2022.01.05
[JAVA] try-with-resources statement  (0) 2021.12.30
[JAVA] java.util 패키지  (0) 2021.12.19
[JAVA] java.lang  (0) 2021.12.15
[JAVA] 예외처리 (Exception handling)  (0) 2021.12.07