내일배움캠프 39일차 TIL : 직렬화 복습

김정환·2024년 11월 7일
0

키워드

  • 직렬화

직렬화 Serialization

  • 흩어져 있던 것들을 정리해서 나열시키는 것.
  • 다시 돌려 놓는 것 : 역직렬화

직렬화를 쓰는 이유

  • 컴파일이나 프로그램을 실행하면 메모리 주소를 할당받고 그 주소에 값이 저장됨.
  • 일반적으로 코드를 작성하면 메모리 주소를 받아 흩어져 존재함.
    • 이때, 주소는 바뀌더라도 값은 그대로 유지시키고 싶음.
      저장 등을 위해서
  • 정보를 나열했다가 되돌린다.
    • 정보를 나열하는 것 : 직렬화
    • 되돌리는 것 : 역직렬화
    • 직렬화만 해두고 나중에 역직렬화?
    • 직렬화해서 저장, 통신할 수도 있는 것.

최초

컴퓨터는 0과 1로 소통

직렬화는 프로그램의 기반

  • Unity의 거의 모든 파일이 직렬화된 파일들오 이루어져있음.

관심사는 사람이 읽을 수 있는 직렬화

1. PlayerPrefs

  • 레지스트리에 저장
  • 권장하진 않음 : 보안상 취약성 때문에
    • 만일 쓸 거라면 : 게임의 설정 계열 - 볼륨 세팅 등등에 관련에 한해서만 사용.
  • 주로 특수문자를 구분자로 사용하는 등
    • 예시에선 , 사용

2. CSV comma separated values

  • 현업에서 자주 사용
  • 엑셀에서 지원
    • 기획자와 협업 시, 매우 빈번하게 사용
    • 저장 시, CSV UTF-8로 저장해야 함.
  • ,로 데이터를 나눠담고, 개행(\n)으로 여러 데이터를 담고 있음.
  • 워낙 빈번하게 쓰여서 라이브러리, 에셋 등으로 제공하고 있음
    • 커스터마이징하는 작업 등등으로 확장해서 사용
	TextAsset csvData = Resources.Load<TextAsset>("CSVData"); // 파일이름
	// Resources.Load<TextAsset>("data/CSVData"); // 폴더 안에 있는 경우
  • 여러 시트도 읽을 수 있음

문제

  • 읽을 순 있는데, 어떤 값인지 알기 어려움.
  • 그 뒤에 읽고 쓰기 좋은 직렬화 방식이 나타남.
    • XML
    • json
    • YAML
  • 공통점 : 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

profile
사파 개발자

0개의 댓글