일반적으로 CS에서 직렬화란 데이터 스토리지 문맥에서 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이를테면 파일이나 메모리 버퍼에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다. 오브젝트를 직렬화하는 과정은 오브젝트를 마샬링한다고도 한다. 반대로, 일련의 바이트로부터 데이터 구조를 추출하는 일은 역직렬화(deserialization)라고 한다.
자바에서 직렬화는 같은 JVM 환경에서 사용하기 위한 직렬화이다. 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 것이다. 즉 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환한다.
Serializable 인터페이스를 통해서 직렬화 대상 클래스를 지정한다. 구현 코드가 없는 인터페이스이며, 해당 인터페이스를 상속받으면 자동으로 자바 소스가 static final long serialVersionUID = <객체 구조 기반 해시값>
을 생성한다.
따라서 명시적으로 serialVersionUID
를 지정하지 않는다면 클래스가 조금만 바뀌어도 바로 역직렬화에서 다른 객체라 예외를 발생시켜 버린다. 객체가 반드시 같아야하는 민감한 상황이 아닌 이상 serialVersionUID
를 지정하여 관리하는 것이 나을 수 있다.
반대로 역직렬화는 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 것이다. 외부의 자바 시스템에서는 직렬화된 객체(byte로 변환된 Object나 Data)를 원래대로 역직렬화해서 사용한다.
직렬화 대상에서 제외 시키고 싶은 변수에 transient
예약어를 달면 제외된다. 예를 들어 보안상 네트워크를 태우기 부담스러운 암호같은 것을 제외시키는데 사용할 수 있다.
https://ko.wikipedia.org/wiki/%EC%A7%81%EB%A0%AC%ED%99%94
https://go-coding.tistory.com/101
https://techblog.woowahan.com/2551/