Serialization

seunghyun·2025년 11월 4일


직렬화란

자료 구조 또는 게임 오브젝트의 상태를 유니티가 저장할 수 있고 추후 Reconstruct 할 수 있는 포맷으로 자동 변환하는 프로세스

  • Serialization (직렬화)은 개체를 저장하거나 메모리, DB 또는 File로 전송하기 위해서 개체를 Byte Stream (데이터를 바이트 단위로 전송하는 것) 으로 변환하는 프로세스이다. 주 목적은 필요할 때 다시 개체로 만들 수 있도록 개체의 상태를 저장하는 것으로, 역 프로세스를 Deserialization (역직렬화)이라고 한다.

  • 유니티는 직렬화를 사용하여 디바이스의 메모리에서 scene, asset, asset bundle을 저장하고 로드한다. 여기에는 monobehavior, scriptableobjects 처럼 scripting api 객체에 저장된 데이터를 포함한다.

  • 이진으로 저장하기도 하지만, 보통 사람이 이해하기 쉽도록 텍스트나 아스키 형태로 저장한다. 주로 XML(Extensible Markup Language), YAML(Yet Another Markup Language), JSON이 많이 쓰인다.

  • 인스펙터 창은 오브젝트의 직렬화된 필드 값을 보여준다. 인스펙터에서 값을 변경할 때 인스펙터는 직렬화된 데이터를 업데이트하고, Inspected object의 업데이트를 수행하는 역직렬화를 트리거한다.

유니티 빌트인 직렬화

  • 유니티에 빌트인된 일부 기능은 자동으로 직렬화를 사용한다.
    • 저장(Saving), 로드
    • 인스펙터창
    • 유니티 에디터에서 스크립트 재로드
    • 프리팹
    • 인스턴스화
  • 유니티에서 직렬화는, asset dependency 때문에 중요해진다. 이런 종속성을 meta file 이나 guid(global unique id) file id 등으로 관리한다.

인스턴스화

  • 프리팹 또는 게임 오브젝트 같이 씬에 존재하는 것에 Instantiate를 호출하면 유니티가 이 항목을 직렬화한다. 런타임, 그리고 에디터에서 모두 발생하고, UnityEngine.Object에서 파생된 모든 항목이 직렬화될 수 있다.

직렬화 규칙

  • 유니티의 Serialzier는 런타임에 효율적으로 동작하도록 디자인되었다. 이는 유니티의 직렬화가 다른 프로그래밍 환경의 직렬화와 다르게 동작하기 때문이다. 유니티의 직렬화는 property가 아닌 C# class field에서 직접 동작하므로 특정 조건을 충족할 때만 직렬화를 수행한다.
  • static, const, readonly 는 필드직렬화 불가능

  • [SerializeField], [HideInInspector] 어트리뷰트

    • 캡슐화는 유지하면서 에디터에서 값을 변경할 수 있는 키워드
    • public이지만 에디터 노출은 막고싶다면 HideInInspector
    • HideInInspector 키워드는 키워드 아래 모든 변수를 숨기지만, SerializeField 키워드는 키워드 바로 다음에 있는 변수 1개만 노출한다.
  • [Serializable]

    • 유니티 에디터의 인스펙터에는 사용자가 정의한 Class 또는 Structrure의 정보가 인스펙터에 노출되지 않는데, System에서 제공하는 이 키워드를 지정하여 Inspector에 노출시킬 수 있다.

참고

0개의 댓글