<CS 지식> Java 직렬화 (Serialization)

Google 아니고 Joogle·2022년 7월 28일
0

CS 지식

목록 보기
14/22

Interface Serializable

  • JAVA API 에서 볼 수 있듯이 Serializable interface에 선언된 메소드는 하나도 없다
  • Classes that do not implement this interface will not have any of their state serialized or deserialized
    하지만 위와 같이 Serializable을 구현하지 않으면 직렬화나 역직렬화를 할 수 없다

1. Serialize

  • 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 변환하는 기술
  • JVM의 메모리(Heap or Stack)에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

즉, Serializable interface를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해줌

1-2. 직렬화 조건

  • implements Serializable 한 객체는 직렬화할 수 있는 기본 조건
  • 직렬화에서 제외하려는 멤버는 transient 선언
  • serialversionUID : 클래스의 변경 여부를 파악하기 위한 유일 키로 직렬화할 때 UID와 역직렬화할 때 UID가 다를 경우 예외 발생 - 설정 권장

1-3. 직렬화 방법

  • 다음과 같이 Serializable interface를 구현한 클래스가 있을 때
import java.io.Serializable;

public class MyClass implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	int n;
	String str;
	
	//int x;
}
  • java.io.ObjectOutputStream를 사용하여 직렬화 진행
static void write (MyClass mc) {
		try (
				ObjectOutputStream oos=new ObjectOutputStream (new FileOutputStream ("MyClass.dat"))
		) {
				oos.writeObject(mc);
                //==========> 직렬화된 객체
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

2. Deserialize

  • byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화 (Deserialize)라고 부름
  • 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태

2-1. 역직렬화 방법

static MyClass read () {
	MyClass mc=null;
	try (
			ObjectInputStream ois=new ObjectInputStream (new FileInputStream ("MyClass.dat"))
	) {
			mc=(MyClass) ois.readObject();
	} catch (IOException | ClassNotFoundException e) {
		e.printStackTrace();
	}
	
	return mc;
		
}

3. Serialize 사용 이유

  • 복잡한 데이터 구조의 클래스의 객체라도 직렬화 기본 조건만 지키면 큰 작업 없이 바로 직렬화, 역직렬화 가능
  • 데이터 타입이 자동으로 맞춰지기 때문에 관련 부분에 큰 신경을 쓰지 않아도 됨

Reference
https://gyoogle.dev/blog/computer-language/Java/Serialization.html
https://devlog-wjdrbs96.tistory.com/268
https://go-coding.tistory.com/101

profile
Backend 개발자 지망생

0개의 댓글