WEB JAVA SPRING/etc

직렬화(Serialization)와 역직렬화(Deserialization)

sshhhh 2023. 10. 10.

정의

- 객체 지향 프로그래밍에서 사용되는 개념

- 객체를 데이터 스트림으로 변환하거나 데이터 스트림에서 객체로 변환하는 과정

- 이러한 과정은 객체의 상태를 저장하고 나중에 다시 복원하는 데 사용.

 - 주로 객체를 파일에 저장하거나 네트워크를 통해 전송하는 상황에서 유용하게 활용

 

+데이터 스트림(Data Stream)은 데이터를 연속적인 일련의 바이트로 표현하는 것


직렬화 (Serialization)

- 직렬화는 메모리에 존재하는 객체를 디스크에 저장하거나 네트워크 통신을 위해 형식에 맞는 데이터로 변환하는 과정
- 객체를 메모리 상태에서 바이트 스트림 또는 문자열로 변환하여 외부 저장소에 저장하거나 전송
- 주로 객체의 필드 값과 클래스 정보가 직렬화
- 예를 들어, 자바에서는 `Serializable` 인터페이스를 구현하여 직렬화 가능한 클래스를 정의

 


역직렬화 (Deserialization)

- 역직렬화는 저장된 데이터를 읽거나 네트워크로부터 전송받은 데이터를 다시 객체로 변환하는 과정
- 직렬화된 데이터를 읽어와서 메모리에 객체로 복원
- 주로 직렬화된 데이터와 관련 클래스 정보를 이용하여 객체를 생성
- 자바에서 역직렬화를 하려면 직렬화된 클래스와 패키지가 동일하고 버전이 호환되어야 함.


 

 

직렬화를 쓰는 이유

1.  데이터들의 메모리 구조는 크게 2가지로 나뉜다

2. 값 형식 데이터(Value Type) :  int, float, char 등, 값 형식 데이터들은 스택에 메모리가 쌓이고 직접 접근이 가능하다

3.  참조 형식 데이터(Reference Type) : C#에서 Object 타입 혹은 C++에서 포인터 변수

    ,힙에 메모리가 할당되고 스택에서는 이 힙 메모리를 참조

4. 이 두가지 데이터 중에서 디스크에 저장하거나 통신에는 값 형식 데이터(Value Type)만 가능하다.

5. 참조 형식 데이터(Reference Type)는 실제 데이터 값이 아닌 힙에 할당되어있는 메모리 번지 주소를 가지고 있기 때문에 저장, 통신에 사용할 수 없다.

6. 직렬화를 하게 되면 각 주소값이 가지는 데이터들을 전부 끌어모아서 값 형식(Value Type)데이터로 변환해준다. 

 

 

+ String이 포인터로 구현되어있는 경우 int, double 등 과는 다르게 내부적으로 메모리가 연속적으로 되어있지 않다.
(int*는 4byte씩 double* 8byte씩 메모리가 연속적으로 배치되어있음)
이 스트링 데이터를 무사히 저장 혹은 전송하기 위해서는
이 메모리 데이터들을 연속적으로 배치, 값 타입 변조 즉 직렬화를 해줘야 하는 것이다. 

 

<결론>

사용하고 있는 데이터들을 파일 저장 혹은 데이터 통신에서 파싱 할 수 있는 유의미한 데이터를 만들기 위함

 

 

 

 

참고

https://hub1234.tistory.com/26#google_vignette

 

데이터 직렬화(serialization)는 무엇이고 왜 필요한가?

우선 이 글은 구글링에서 나오는 여러 가지 직렬화에 대한 글들과 설명들을 읽고 제 나름대로 한번 더 이해하기 편하도록 정리한 글입니다. 데이터 직렬화(serialization), 역직렬화(deserialization)는

hub1234.tistory.com

 

'WEB JAVA SPRING > etc' 카테고리의 다른 글

HttpServletRequest request  (0) 2023.10.05
JSON 배열 다루기  (0) 2023.10.05
객체지향 프로그래밍의 4가지 특징  (0) 2023.08.28
MVC model2 //DispatcherServlet  (0) 2023.08.28
Spring 어노테이션  (0) 2023.08.28

댓글