[CS] 직렬화/역직렬화 이야기

Jay·2021년 1월 18일
0

Computer Science

목록 보기
9/50
post-thumbnail

🧐 객체를 저장하거나 메모리, DB 혹은 파일로 옮기려면 어떻게 해야할까?

Conception

직렬화 :: Serialize

  • 객체를 바이트 스트림으로 바꾸는 것.
    * 바이트 스트림** : 8비트의 바이트 단위로 입출력하는 클래스, 이진 데이터를 읽고 쓰기 위하여 사용.
  • 객체에 저장된 데이터를 스트림에 write하기 위해 연속적인 serial 데이터로 변환하는 것.
  • program의 object에 담긴 데이터를 어떤 외부 파일에 write 및 전송하는 것.

주 목적 : 객체를 상태 그대로 저장하고 필요시 다시 생성하여 사용하는 것!


역직렬화 :: Deserialize

  • 어떤 외부 파일의 데이터를 프로그램 내의 object로 read 하는 것.
  • 네트워크나 영구저장소에서 바이트 스트림을 가져와서 객체가 저장되었던 그 상태로 변환하는 것.

특징

  • 직렬화 하면서 생긴 바이트 스트림은 플랫폼에 독립적이다.
  • 직렬화된 객체는 다른 플랫폼에서 역직렬화가 가능하다.
  • java.io.Serializable 인터페이스를 구현한 클래스의 객체만 직렬화가 가능하다.
  • 직렬화 당시 같은 클래스를 사용하여야 역직렬화가 가능하다(SerialVersionUID로 가능)

객체/클래스 직렬화

  • 전송할 데이터들을 하나의 버퍼에 연속된 비트 단위로 길게 나열하여 연속으로 저장하는 방식
  • 직렬화된 버퍼를 수신하면 다시 객체의 각 멤버 타입에 맞게 분리(역직렬화)하여 데이터를 복구한다.

왜 필요할까?

  • 상대 Host와 데이터를 주고 받을 때, 데이터 종류는 원시 타입 일 수 있지만, 포인터 타입을 가질 수도 있다. 포인터 타입은 어떤 유효 값에 대한 주소를 갖는데, 이는 자신의 컴퓨터의 메모리 주소에 해당하기에 상대방의 동일한 주소에도 동일 값이 있으리라 확신 못한다. 그래서 포인터를 그대로 넘기면 이상한 값이 될 수 있다. 클래스 타입도 마찬가지이다.

profile
developer

0개의 댓글