정의
- 객체 지향 프로그래밍에서 사용되는 개념
- 객체를 데이터 스트림으로 변환하거나 데이터 스트림에서 객체로 변환하는 과정
- 이러한 과정은 객체의 상태를 저장하고 나중에 다시 복원하는 데 사용.
- 주로 객체를 파일에 저장하거나 네트워크를 통해 전송하는 상황에서 유용하게 활용
+데이터 스트림(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
'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 |