키워드
직렬화 Serialization
- 흩어져 있던 것들을 정리해서 나열시키는 것.
- 다시 돌려 놓는 것 : 역직렬화
직렬화를 쓰는 이유
- 컴파일이나 프로그램을 실행하면 메모리 주소를 할당받고 그 주소에 값이 저장됨.
- 일반적으로 코드를 작성하면 메모리 주소를 받아 흩어져 존재함.
- 이때, 주소는 바뀌더라도 값은 그대로 유지시키고 싶음.
저장 등을 위해서
- 정보를 나열했다가 되돌린다.
- 정보를 나열하는 것 : 직렬화
- 되돌리는 것 : 역직렬화
- 직렬화만 해두고 나중에 역직렬화?
- 직렬화해서 저장, 통신할 수도 있는 것.
최초
컴퓨터는 0과 1로 소통
직렬화는 프로그램의 기반
- Unity의 거의 모든 파일이 직렬화된 파일들오 이루어져있음.
관심사는 사람이 읽을 수 있는 직렬화
1. PlayerPrefs
- 레지스트리에 저장
- 권장하진 않음 : 보안상 취약성 때문에
- 만일 쓸 거라면 : 게임의 설정 계열 - 볼륨 세팅 등등에 관련에 한해서만 사용.
- 주로 특수문자를 구분자로 사용하는 등
2. CSV comma separated values
- 현업에서 자주 사용
- 엑셀에서 지원
- 기획자와 협업 시, 매우 빈번하게 사용
- 저장 시, CSV UTF-8로 저장해야 함.
- ,로 데이터를 나눠담고, 개행(\n)으로 여러 데이터를 담고 있음.
- 워낙 빈번하게 쓰여서 라이브러리, 에셋 등으로 제공하고 있음
TextAsset csvData = Resources.Load<TextAsset>("CSVData");
문제
- 읽을 순 있는데, 어떤 값인지 알기 어려움.
- 그 뒤에 읽고 쓰기 좋은 직렬화 방식이 나타남.
- 공통점 : Key - Value 방식
3. XML
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<GameData> // 루트 노드
<PlayerData> // 자식 노드
<nickname>name</nickname> // 요소 - 엘리멘트
<lv>5</lv> // 요소 - 엘리멘트
<hp>5</hp> // 요소 - 엘리멘트
</PlayerData>
</GameData>
- 한 때 광범위하게 사용됨
- 단, 엄격한 문법이 요구됨.
4. JSON
- 사용하기 편해지고 쉬워진 형태
- 디폴트 사용
- 편하게 쓰라고 관련된 기능이 많음
- 라이브러리
- Newtonsoft
- LitJson
- JsonUtility (Unity 제공)
- Unity에선 JsonUtility를 쓰는 것을 추천
- JsonUtility가 반응 속도가 가장 빠름.
- 속도 차이의 이유?
- 유니티의 기반 프로그램은 CPP
- 타 라이브러리는 C#기반이기에 반응이 느림
- JsonUtility는 애초에 CPP로 만들어져서 속도는 빠름
- 단, JonsUtility의 직렬화 규칙이 엄격함
JonsUtility의 직렬화 규칙
- 직렬화 규칙만 적용하면 타 Json 라이브러리에 비해 최대 100배 빠른 속도를 얻을 수 있음
- 단, 딕셔너리 등 몇몇의 자료형은 직렬화가 안됨
- 이런 경우를 위해 커스텀 직렬화 방법을 제공하고 있긴 함.
암호화 필요
- 로컬 저장 시, 변조의 위험이 있음
- 그러므로 암호화, 복호화할 필요가 있음
- 직렬화 -> 암호화 -> 저장 -> 불러오기 -> 복호화 -> 역직렬화
5. SO : Scriptable Object
장점
- Json, Xml 등에서 안되는 것을 지원
- RigidBody, Collider 등등을 레퍼런스로서 직렬화 가능
- 데이터가 많아질 경우 직렬화, 역직렬화 시간이 늘어남 = 로딩 시간이 늘어나는 것
- CSV 등 파일을 SO로 변환시켜서 로드 시간을 빠르게 하는 것도 가능.
단점
- 에디터 상에선 문제가 없는데, 빌드에서 문제가 생김.
- 런타임에서 값을 바꿔도, 다시 실행하면 처음 빌드했을 때 값으로 복구됨.
- 빌드했을 때, 수치가 고정된다.
- 그래서 절대 변동되지 않을 값을 저장해야 함.
YAML
- 머신러닝 등등에서 학습했을 때, AI 학습 두뇌가 저장됨.
- 게임 개발에서는 대체로 사용할 일은 많지 않음.
#내일배움캠프 #스파르타내일배움캠프 #스파르타내일배움캠프TIL