직렬화란?
자바 시스템 메모리에 상주해있는 객체나 데이터를 바이트의 형태로 변환하는 것. 반대로 바이트의 형태를 객체나 데이터로 변하는 것은 역직렬화라한다. (비슷하게, 테이블 형태의 데이터를 직렬화하는 것은 CSV, 통신에 사용하기 위해 사용하는 것은 JSON이 있다. 자바에서의 직렬화는 자바 시스템 간의 데이터 교환을 위한 것이다.)
언제 쓰이는가?
자바 시스템이 종료되어도 해당 객체 / 데이터가 남아있어야할 때나 네트워크로 전송해야할 때 직렬화하여 영속화(Persistence)한다. 특히 Class를 그대로 DB에 넣고, 같은 혹은 다른 자바 시스템에서 이 Class를 사용하고싶다면 직렬화하여 바이트의 형태로 DB에 저장한 뒤, 사용할 때는 DB에 있는 바이트의 데이터를 역직렬화하여 사용한다.
왜 쓰이는가?
사실 여러 일반적인 직렬화 (JSON 같이)을 사용할 수 있겠지만, 자바 직렬화를 쓰는 이유는 이름에서부터 유추할 수 있듯이 자비 시스템에서 최적화 되어있기 때문이다. 특히, 클래스의 객체가 복잡해지는 경우, JSON 등으로 저장하기는 까다롭겠지만 자바 직렬화를 사용한다면 강타입으로도 저장이 가능하기 때문에 매우 편리하다.
어디에 쓰이는가?
서블릿 세션, 캐시, 자바 RMI 등에 쓰인다.
SUID(Serialversion UID) 란?
말 그대로는 직렬화 버전의 고유값이다. (직렬화 할) 클래스에 SUID 를 지정하여 다른 클래스와 구분할 수 있도록 도와주고, 다른 이가 이 클래스를 사용할 때, 올바른 (변질되지 않은) 클래스인지 확인할 때 SUID를 이용하여 확인한다. 동일한 이름의 클래스여도 구조가 다를 경우(즉, SUID가 다르다면) InvalidClassException이 생긴다.
기본 SUID 값을 정하는 기준은 다음과 같다.
1. 클래스 이름
2. 클래스의 접근 제한자
3. 각 멤버 필드의 고유값 (이름, 접근 제한자, 타입 등)
4. 각 멤버 메서드의 고유값 (이름, 파라미터, 리턴 타입 등)
5. 각 생성자의 고유값 (접근 제한자, 파라미터 정보 등)
6. static initializer block 존재 유무 등
그렇기 때문에 클래스에 사소한 변경이 일어나도 기본 SUID값은 바뀌어버린다. 그래서 serilalizable 객체로 통신에 사용되는 클래스들은 기본 SUID 값이 아닌 명시적으로 지정해주는 것이 좋다.
https://woowabros.github.io/experience/2017/10/17/java-serialize.html
https://woowabros.github.io/experience/2017/10/17/java-serialize2.html
https://madplay.github.io/post/java-serialization-advanced
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=credenda&logNo=80154311703
https://blog.naver.com/writer0713/22092209905
https://nesoy.github.io/articles/2018-04/Java-Serialize
'프로그래밍 공부 > Java' 카테고리의 다른 글
orElse 와 orElseGet에 관한 좋은 글 (0) | 2021.07.28 |
---|---|
[잡설] 구현체에 대해... (0) | 2021.06.10 |
[Lamda] :: (0) | 2021.06.03 |
[Java.util]Optional (0) | 2021.05.26 |
@Transactional (0) | 2021.05.25 |
댓글