사실 직렬화는 유니티에서만 통용되는 개념이 아니다. 이번에 다룰것은 유니티의 C# 직렬화에 기반을 둔다.
Serialization(시리얼라이제이션, 직렬화)
의미 자체는 특정 객체(데이터)를 바이트의 나열로 바꿔서 파일이나 네트워크통신으로 Stream 가능하게 해주는 것이다. 반대로 직렬화된 바이트의 나열을 원래 객체(데이터)로 바꿔주는 것은 Deserialize(디시리얼라이즈, 역직렬화) 라고 한다. 결국 바이너리 데이터와 객체 데이터 사이의 인코딩과 디코딩인 것이다.
[출처 : Effective Java(by. 이승헌) brunch, https://brunch.co.kr/@oemilk/179]
Serialization는 왜 하는가?
한단어로 이야기하자면 ‘영속성’이 아닐까 한다. 영속성이란 오래도록 계속 유지되는 성질을 뜻한다. 객체를 다른 컴퓨터나 프로그램이 종료되고도 남겨놓거나 재사용하고 싶다면 어떻게 해야할까? 해당 객체에 관련된 코드가 있어야 할것이다. 하지만 코드만 있다고 끝인가? 아니다 객체에 대한 정보가 있어야 한다. 하나의 컴퓨터라면 있을수도 있다. 하지만 다른 컴퓨터나 프로그램이 종료됬다면? 객체에 관한 정보는 사라지지 않았을까? 객체를 있던 그대로 사용하거나 전송하기에는 무리가 있을것이다. 이때 바이트스트림으로 남겨놓거나 변환한다면 이 문제가 해결된다. 한마디로 직렬화를 하는 이유는, 이용하던(이용할) 데이터를 ‘복원’ 하기 위한 과정인것이다.
Unity의 Serialization
자바의 직렬화, 네트워크 직렬화 등등 각자의 환경에 직렬화는 직렬화 가능한 조건이 있다. 유니티도 마찬가지다. 유니티에서 사용되는 클래스(스크립트에 작성된)를 직렬화를 하기 위해서는 다음 조건을 지켜야 한다.
- ‘public’ 또는 ‘[SerializeField]’ 속성을 가져야 한다.
class MyClass{ public int serializeNum1; // or [SerializeField] private int serializeNum2 }
- ‘[SerializeField]’ 속성을 가졌다면 구조체와 class도 가능
- 구조체의 경우 Unity 4.5버전부터 가능하며, class의 경우는 비추상 클래스여야 한다.
- static, const, readonly가 아니여야 한다.
- ‘fieldtype’은 직렬화 할 수 있는 타입이어야 한다.
- int, string, bool, float 등의 기본타입
- 직렬화 가능한 배열이나 제네릭(
) - UnityEngine.Object 에서 파생한 오브젝트의 참조