CS/C# & Unity

직렬화와 역직렬화

혀니리리 2023. 12. 12. 12:24
728x90

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

 

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

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

hub1234.tistory.com

직렬화: 객체에 저장된 데이터를 I/O 스트림에 쓰기(출력) 위해 연속적인(serial) 데이터로 변환하는 것

역직렬화: I/O 스트림에서 데이터를 읽어서(입력) 객체를 만드는 것

 

객체를 직렬화한다: 객체 상태를 바이트 스트림으로 바꿔서 바이트스트림을 객체의 복사본으로 되돌릴 수 있음을 의미

 

앞서 얘기한대로 직렬화는 데이터를 저장 혹은 통신에 사용하기 위함인데 데이터를 그냥 사용하면 안 되고  직렬화라는 과정을 거쳐야 할까? 

 

개발 언어로 무엇을 사용하던(C++, C, C#, Java 등,,) 사용하는 데이터들의 메모리 구조는 크게 2가지로 나뉜다. 

1. 값 형식 데이터(Value Type) : 우리가 흔히 선언해서 사용하는 int, float, char 등, 값 형식 데이터들 스택에 메모리가 쌓이고 직접 접근이 가능하다.

2. 참조 형식 데이터(Reference Type) : C#에서 Object 타입 혹은 C++에서 포인터 변수들이 여기에 해당된다. 해당 형식의 변수를 선언하면 에 메모리가 할당되고 스택에서는 이 힙 메모리를 참조하는(힙에 메모리 번지 주소를 가지고 있음) 구조로 되어있다.

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

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

 

왜 참조 형식 데이터는 사용할 수 없을까 ? 

예를 들자면

포인터 변수 Class A 를 선언하고 객체를 만들어 그 주소 값이 0x00045523라고 가정하자. 

그리고 이 값을 파일에 포함하여 저장했다고 해보자. 

그 후 프로그램을 종료하고 다시 실행해서 주소값 0x00045523을 가져오더라도 기존 A 객체의 데이터를 가져올 수 없다.(프로그램이 종료되면 기존에 할당되었던 메모리(0x00045523)는 해제되고 없어진다)

 

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

이러한 이유 때문에 데이터를 저장, 통신전에 '데이터 직렬화(Serialization)' 작업이 필요한 것이다!! 

 

요약: 직렬화를 쓰는 이유는 사용하고 있는 데이터들을 파일 저장 혹은 데이터 통신에서 파싱 할 수 있는 유의미한 데이터를 만들기 위함이다. 

 

JQuery serialize( ), serializeArray( ), serializeObject( ) 사용법 (tistory.com)

 

JQuery serialize( ), serializeArray( ), serializeObject( ) 사용법

프로젝트 하면서 헷갈리는것들 정리 했습니다. 이런 형태의 form이 있을때 serialize JQuery에서 제공하는 기능인 serialize 메서드는 태그 내부의 값을 name=value으로 변경하면서 쿼리 스트링을 만들어준

soso-shs.tistory.com

 

액체진입에서의 예시

값 참조만 하는 playerData => 바로 ToJson으로

리스트를 많이 포함한 StageData => SerializeObject로 변환

728x90

'CS > C# & Unity' 카테고리의 다른 글

C#의 string  (0) 2023.12.12
const와 readonly의 차이 (+ static)  (1) 2023.12.12
스태틱 게임오브젝트와 배칭  (0) 2023.10.01
드로우콜과 배치  (0) 2023.10.01
[C#]박싱 언박싱  (0) 2023.09.27