데이터 직렬화(serialization)는 무엇이고 왜 필요한가? (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)
액체진입에서의 예시
값 참조만 하는 playerData => 바로 ToJson으로
리스트를 많이 포함한 StageData => SerializeObject로 변환
'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 |