Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

UpDown Dev Story

자바(Java) 직렬화(Serializable) 대해 알아보자 본문

Java

자바(Java) 직렬화(Serializable) 대해 알아보자

updown 2021. 7. 10. 01:32

직렬화(Serializable) 란?

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

역직렬화(Deserialize) 란?

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

직렬화 방법

  • 변환하려는 객체가 Serializable 인터페이스를 implements 해야한다
    • serialVersionUID라는 값을 지정해 주는 것을 권장한다
      • 별도로 지정하지 않으면, 자바 소스가 컴파일될때 자동으로 생성된다.
  • 만약 Serializable 인터페이스를 implements 하지 않았다면 NotSerializableException이 발생한다
  • 변환하려는 객체에 

serialVersionUID

  • 직렬화한 객체를 역직렬화 할때 해당 객체가 같은 객체인지 확인 할 수 있도록 하는 값
  • 클래스 이름이 같아도 serialVersionUID 값이 다를경우 다른 클래스로 인식한다
  • serialVersionUID값이 같아도 클래스의 변수의 개수나 타입 등이 다르면 다른 클래스로 인식한다

예시

  1. Serializable 인터페이스를 implements한 객체를 생성하고 해당 객체를 로컬 PC에 저장한다 (xxx.obj 로 저장된다)
  2. Serializable 인터페이스를 implements한 객체 타입으로 해당 파일을 읽어온다 (정상적으로 객체를 읽어온다)
  3. 이번에는 Serializable 인터페이스를 implements한 객체에 어떤 변경이 생긴다 (serialVersionUID가 다시 채번됨)
  4. Serializable 인터페이스를 implements한 객체에 변수를 추가한 타입으로 해당 파일을 읽어온다 (serialVersionUID가 맞지 않다고 에러가 발생한다)
  5. 이럴 경우에serialVersionUID를 명시적으로 선언해주면 해결 할 수 있다

transient

  • 객체의 데이터 중 일부의 데이터는(패스워드와 같은 보안) 여러가지 이유로 전송을 하고 싶지 않을 수 있다. 이러한 변수는 직렬화에서 제외해야 되며, 이를 위해서 변수에 transient를 선언한다.

 

Comments