2022. 4. 13. 00:12ㆍTech/Unity
- 목차
이 글은 이전에 운영하던 깃 블로그에서 옮겨온 글입니다.
서론
사실 직렬화는 Unity에서만 통용되는 개념이 아닙니다 다. 이번 글에서는 Unity의 C# 직렬화에 대해서 다뤄보려 합니다.
Serialization(시리얼 라이제이션, 직렬화)
의미 자체는 특정 객체(데이터)를 바이트의 나열로 바꿔서 파일이나 네트워크 통신으로 Stream 가능하게 해주는 것입니다. 반대로 직렬화된 바이트의 나열을 원래 객체(데이터)로 바꿔주는 것은 Deserialize(디시 리얼라이즈, 역직렬화)라고 합니다. 결국 바이너리 데이터와 객체 데이터 사이의 인코딩과 디코딩인 것입니다.
Serialization는 왜 하는가?
한단어로 이야기하자면 '영속성'이 아닐까 합니다. 영속성이란 오래도록 계속 유지되는 성질을 뜻합니다. 객체를 다른 컴퓨터나 프로그램이 종료되고도 남겨놓거나 재사용하고 싶다면 어떻게 해야 할까요? 해당 객체에 관련된 코드가 있어야 할 것입니다.
하지만 코드만 있다고 끝인가? 아닙니다. 객체에 대한 정보가 있어야 합니다. 하나의 컴퓨터라면 있을수도 있습니다. 하지만 다른 컴퓨터나 프로그램이 종료됐다면? 객체에 관한 정보는 사라지지 않았을까요? 객체를 있던 그대로 사용하거나 전송하기에는 무리가 있을 것입니다.
이때 바이트스트림으로 남겨놓거나 변환한다면 이 문제가 해결됩니다. 한마디로 직렬화를 하는 이유는, 이용하던(이용할) 데이터를 '복원' 하기 위한 과정인 것입니다.
Unity의 Serialization
Java 직렬화, Network 직렬화 등등 각자의 환경에 직렬화는 직렬화 가능한 조건이 있습니다. Unity도 마찬가지입니다. Unity에서 사용되는 클래스(스크립트에 작성된)를 직렬화를 하기 위해서는 다음 조건을 지켜야 합니다.
우선, 'public' 또는 '[SerializeField]' 속성을 가져야 합니다.
class MyClass{
public int serializeNum1;
[SerializeField]
private int serializeNum2;
}
- '[SerializeField]' 속성을 가졌다면 구조체와 class도 가능
- 구조체의 경우 Unity 4.5 버전부터 가능하며, class의 경우는 비 추상 클래스여야 함
static, readonly, const 가 아니어야 합니다. 당연하겠네요. 값이 정해져 있고 공용으로 사용되는 영역이며, 수정이 불가능 하니 말이죠.
다음으로는 'fieldtype'은 직렬화 할 수 있는 타입이어야 합니다. 자세한 예시는 아래와 같습니다.
- int, string, bool, float 등의 기본 타입
- 직렬화 가능한 배열이나 제네릭()
- UnityEngine.Object 에서 파생한 오브젝트의 참조
리소스 출처
[그림 1] : Effective Java(by. 이승헌) brunch, https://brunch.co.kr/@oemilk/179
'Tech > Unity' 카테고리의 다른 글
[Unity]Asset bundle 기본 개념 (2) | 2022.06.12 |
---|---|
[Unity]UIWebView Deprecated 이슈 해결 법 (0) | 2022.04.13 |
[Unity]로드된 리소스의 메모리 누수 (0) | 2022.04.13 |
[Unity]Unity mobile native plugin (0) | 2022.04.12 |
[Unity]Scene 사이의 전환 (0) | 2022.04.12 |