[Unity] 역/직렬화

a-a·2025년 6월 8일

알쓸신잡

목록 보기
23/26

이모저모

필자가 21살에 C# 네트워크 전공 시간에 자체 프로토콜을 만들어 멀티 보드 게임을 만들게 되면서 처음으로 접한 지식이다. 기술적인 내용일 경우에 지피티가 작성해주는 것이 훨-씬 가독성이 좋다는 것을 알게됐다.. 슬프다.

필자가 넣은 프롬프트인데, 주소 번지대로 복원하는 것은 C++ 방식이라고 한다. C#은 보안을 강화하고자 메모리 구조가 아닌 필드별 데이터를 대응시켜 객체를 새로 생성하는 방식이라고 한다...!


📌 기본 개념: 직렬화와 역직렬화란?

직렬화 (Serialization)

"객체 → 저장하거나 전송 가능한 데이터 형태로 변환"

  • 메모리 상의 객체를 JSON, XML, 바이너리 등으로 변환
  • 데이터 저장, 네트워크 전송, 로그 기록 등에 활용

역직렬화 (Deserialization)

"데이터 → 객체로 복원"

  • JSON 문자열 등에서 객체를 생성하고, 필드에 데이터를 채움
var json = JsonConvert.SerializeObject(myObj);
var obj = JsonConvert.DeserializeObject<MyClass>(json);

🧩 Unity에서의 직렬화 개념

Unity의 직렬화 시스템 특징

  • Unity는 자체 직렬화 시스템을 사용 (에디터 및 런타임 모두 대응)
  • Inspector에 노출 가능한 필드만 직렬화 대상

직렬화 가능한 필드의 조건

항목직렬화 가능 여부
기본 타입 (int, float, string 등)✅ 가능
[Serializable] 클래스✅ 가능 (필드에 public 또는 [SerializeField] 필요)
Dictionary, delegate, static 등❌ 불가

⚙️ C#의 다양한 직렬화 방법

주요 직렬화 도구

방법설명
BinaryFormatter✅ 오래된 방식. 보안 취약점으로 인해 현재는 비권장
JsonUtility✅ Unity 내장, 속도 빠름. 기능은 제한적
Newtonsoft.Json (Json.NET)✅ 가장 범용적. Dictionary, enum, nested 객체 모두 지원
System.Text.Json✅ .NET Core 이후 공식 지원. Unity에서는 일부 제한 있음

🔍 Unity JSON 비교: JsonUtility vs Newtonsoft.Json

항목JsonUtilityNewtonsoft.Json
Dictionary 지원❌ 불가✅ 가능
중첩 객체 직렬화제한적매우 유연
성능빠름 (C++ 기반)느림 (리플렉션 기반)
enum 표현 방식정수 (int)문자열 또는 정수 모두 가능

툴 개발에서는 보통 Newtonsoft.Json을 권장합니다.


✅ 장점과 한계 정리

장점

  • 객체 상태를 텍스트나 이진 형태로 저장 가능
  • 다른 플랫폼이나 시스템 간 데이터 전송에 적합
  • 구조화된 데이터를 디버깅/로깅에 활용하기 쉬움

한계와 주의점

항목설명
참조 순환 (Cyclic Reference)무한 루프 발생 가능. 감지 및 방지 설정 필요
구조 변경 시 호환성 문제필드 추가/삭제 시 역직렬화 오류 발생 가능
Unity 전용 제한static, delegate, Dictionary 등 직렬화 불가
JsonUtility는 기능 제한enum 문자열 표현, 커스텀 포맷 지정 불가

🧠 컴퓨터 과학(CS) 관점에서 알아두면 좋은 지식

1. Endian 문제 (바이트 순서)

  • 바이너리 직렬화 시, CPU 아키텍처에 따라 Little/Big Endian 차이 발생
  • JSON은 텍스트 기반이라 안전하지만, 바이너리는 Endian 처리 필요

2. 메모리 덤프 vs 구조 기반 직렬화

  • C++은 메모리 구조를 그대로 저장 가능
  • C#은 Garbage Collector와 참조형 필드 때문에 구조 정보를 따로 보존해야 함

3. Serialization Surrogate (대리 객체)

  • 직렬화 불가능한 타입을 우회하는 방식
  • Unity에서는 delegate나 인터페이스 등을 우회할 때 유용

4. 그래프 vs 트리 구조

  • JSON은 트리 기반 직렬화에 적합
  • 객체 간 참조가 많은 그래프 구조에서는 ReferenceLoopHandling 등 설정이 필요

💬 실무에서 자주 묻는 고급 질문들

질문답변 요령
Unity에서 Dictionary를 JSON으로 저장할 수 있나요?JsonUtility는 불가, Newtonsoft.Json 사용 필요
구조체(struct)는 직렬화 가능한가요?참조형 필드가 없으면 가능. 복잡한 경우 class 추천
직렬화된 JSON의 버전을 바꿀 수 있나요?version 필드를 직접 두고 분기 처리 필요
성능 이슈가 있다면?바이너리 포맷, 압축(JSON → GZip) 고려

✅ 마무리 정리

  • 직렬화는 데이터를 저장·전송 가능한 형태로 변환하는 핵심 기술입니다.
  • Unity에서는 JsonUtility 또는 Newtonsoft.Json을 활용해 다양한 구조를 저장할 수 있으며,
  • 복잡한 구조나 확장성, 실무 연계성을 고려할 때는 Newtonsoft.Json이 보다 유리합니다.
  • 구조 설계, 성능, 유지보수 관점에서 포맷을 신중하게 선택하는 것이 중요합니다.
profile
"게임 개발자가 되고 싶어요."를 이뤄버린 주니어 0년차

4개의 댓글

comment-user-thumbnail
2025년 6월 10일

글에서 GPT향기가 스멀스멀 나네요?

2개의 답글