데이터 직렬화란 데이터를 직렬화 한다고 한다면 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하기 위해 사용한다고 보면됩니다. 다시 이것을 디스크에 저장한 데이터를 읽거나, 네트워크 통시능로 부터 받은 데이터를 메모리에 쓸수 있도록 변환 하는 것을 데이터 역질렬화
라고 합니다.
데이터의 구조를 크게 값 형식의 데이터(int,char,float) 참조 형식 데이터(객체,힙 메모리에 할당되는 데이터)로 구분 해보겠습니다.
위 데이터중 참조 형식의 데이터는 실제 데이터의 값이 아닌 힙에 할당된 메모리 주소를 가지고 있기 때문에 실제 디스크에 저장하거나 통신할 때는 값 형식의 데이터만 사용합니다.
즉 디스크에 저장하거나 네트워크 통신을 할 때 값 형식의 데이터만 사용 가능하고, 직렬화(
객체를 다른 환경에 저장했다가 나중에 재구성 할 수 있게 만드는 과정)를 통해 각 객체들의 주소 값이 가지는 데이터를 전부 값 형식의 데이터(int,char,float)로 변환 해 주어 사용하게됩니다.
즉 직렬화를 하는 이유는 데이터를 디스크에 저장하거나 네트워크를 사용한 데이터 통신에서 파싱할 수있는 유의미한 데이터를 만들기 위한다고 보면 되겠습니다.
Json,XML과 같은 포맷을 이용한 직렬화도 가능합니다. 이로 인해 다른환경 , 다른언어로 만들어진 어플리케이션과도 통신이 가능해집니다. JSON 파싱,처리를 위해 JAVA는 Jackson이라는 라이브러리를 사용합니다.
자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야기합니다.
자바 기본(primitive) 타입과 java.io.Serializable 인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본 조건을 가집니다.
직렬화 대상이 된 객체의 클래스가 클래스 패스에 존재해야 하며 import 되어 있어야합니다.
중요한 점은 직렬화와 역직렬화를 진행하는 시스템이 서로 다를 수 있다는 것을 반드시 고려해야 합니다.
자바에서는 객체의 직렬화, 역직렬화를 위해 ObjectInputStream과 ObjectOutputStream을 사용합니다.
ObjectOutputStream extends OutputStream
ObjectInputStream extends InputStream
역직렬화 : 스트림으로부터 객체를 입력받기 위해 사용
readObject() : Object로 리턴되므로 형변환 필요
다른 데이터 직렬화 종류
- CSV
JVM의 메모리에서만 상주되어있는 객체 데이터를 그대로 영속화(Persistence)가 필요할 때 사용됩니다. 즉 시스템이 종료되더라도 없어지지 않는 영속화된 데이터로 다른 네트워크로도 전송이 가능해집니다. 다음이 대표적인 예시입니다.
(이팩티브 java 아이템 85. 자바 직렬화의 대안을 찾으라) 자바에서 직렬화는 권장되지 않는 경우가 습니다다. 너무 엄격한 타입 체크, 공격 범위가 넓어 악의적으로 공격할 수 있는 요소가 많습니다.
그렇기 때문에 직렬화를 구현할지는 신중히 결정해야 합니다.
CSV, JSON 같은 형태의 직렬화는 대부분의 시스템에서 데이터교환 시 많이 사용됩니다.
자바 직렬화 형태의 데이터 교환은 자바 시스템 간의 데이터 교환을 위해서 존재한다고 보면 될 것 같습니다.
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!