. 자바 직렬화(Serializable) 에 대해서..
본문 바로가기
프로그래밍 공부/Java

자바 직렬화(Serializable) 에 대해서..

by 불냥이_ 2021. 6. 20.

직렬화란?

 자바 시스템 메모리에 상주해있는 객체나 데이터를 바이트의 형태로 변환하는 것. 반대로 바이트의 형태를 객체나 데이터로 변하는 것은 역직렬화라한다. (비슷하게, 테이블 형태의 데이터를 직렬화하는 것은 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

 

자바 직렬화, 그것이 알고싶다. 훑어보기편 - 우아한형제들 기술 블로그

자바의 직렬화 기술에 대한 대한 이야기입니다. 간단한 질문과 답변 형태로 자바 직렬화에 대한 간단한 설명과 직접 프로젝트를 진행하면서 겪은 경험에 대해 이야기해보려 합니다.

woowabros.github.io

 

https://woowabros.github.io/experience/2017/10/17/java-serialize2.html

 

자바 직렬화, 그것이 알고싶다. 실무편 - 우아한형제들 기술 블로그

자바의 직렬화 기술에 대한 대한 두 번째 이야기입니다.실제 자바 직렬화를 실무에 적용해보면서 주의해야 할 부분에 대해 이야기해보려고합니다.

woowabros.github.io

 

https://velog.io/@hellonewtry/%EC%9E%90%EB%B0%94-%EC%A7%81%EB%A0%AC%ED%99%94%EB%9E%80-serialVersionUID-%EB%9E%80#:~:text=*%20SerialVersionUID(SUID)%20%EB%9E%80%20%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C%3F,-%EB%A7%90%20%EA%B7%B8%EB%8C%80%EB%A1%9C%20%ED%95%B4%EC%84%9D&text=%EC%A7%81%EB%A0%AC%ED%99%94%20%EB%B2%84%EC%A0%84%EC%9D%98%20%EA%B3%A0%EC%9C%A0%EA%B0%92,%EC%95%84%EB%8B%8C%EC%A7%80%EB%A5%BC%20%ED%8C%90%EB%8B%A8%20%ED%95%98%EA%B2%A0%EB%8B%A4%EB%8A%94%20%EA%B2%83. 

 

자바 직렬화(serialize)란? serialVersionUID 란?

오늘은 자바 직렬화에 대해 간단히 정리해보려고 한다. 직렬화란 무엇일까? >직렬화란 컴퓨터의 메모리 상에 존재하는 데이터를 파일로써 저장하거나, 통신하는 다른 컴퓨터에게 알맞은 형식에

velog.io

 

 

https://madplay.github.io/post/java-serialization-advanced

 

자바 직렬화: SerialVersionUID는 무엇일까?

자바 직렬화를 사용할 때 필요한 SerialVersionUID는 무엇일까?

madplay.github.io

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=credenda&logNo=80154311703 

 

[java] serialVersionUID 기본 알고리즘

자바에서 serial version uid를 생성하는 것은 기본적으로 서로 다른 클래스들 간의 구별을 하기 위한 것이...

blog.naver.com

 

 

 

 

https://blog.naver.com/writer0713/22092209905

 

[java] serialVersionUID의 용도

serialVersionUID는 직렬화 (implements Serializable) 를 할 때 사용한다. 보통 IDE에서 Seriali...

blog.naver.com

https://nesoy.github.io/articles/2018-04/Java-Serialize

 

Java의 직렬화(Serialize)란?

 

nesoy.github.io

 

'프로그래밍 공부 > 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

댓글0