직렬화(Serialization)란?
- 정의 : 직렬화는 객체나 데이터를 저장하거나 전송하기 위해 일관된 형식으로 변환하는 과정입니다.
- 목적 : 데이터를 파일로 저장하거나 네트워크를 통해 전송하고, 필요할 때 원래의 객체 상태로 복원할 수 있게 합니다.
우선 직렬화는 서로 다른 환경의(서로 다른 컴퓨터에서) 데이터를 저장하거나 전송하기 위해서는 기준이 되는 데이터로 구성되어 있어야 했고, 이를 위해서 채택된 것이 바이트 스트림입니다.
바이트 스트림은 입출력을 할 때 널리 사용되는 방식으로, 데이터를 처리할 때 바이트 단위로 처리한다는 특징이 있습니다.
이미지나 텍스트, 동영상까지 결국 내부적으로 바이트라는 단위를 통해서 처리가 되는데, 그렇다면 각각의 데이터들을 보게되면 결국 일정한 데이터를 일렬로 세워서 순차적으로 처리하고 있다고 볼 수 있게 됩니다.
이러한 맥락에서 기존에 사용하던 특정 데이터들의 집합을 재구성하여, 한 줄로 세워진 데이터 형식인 바이트 스트림으로 데이터를 변환하여 처리한다는 의미에서 "직렬화" 라는 단어를 사용하게 되었습니다.
데이터를 한 줄로 세운다는 표현은 실제 데이터의 위치를 기준으로 생각해보면 다음과 같이 생각해볼 수 있습니다.
데이터들은 메모리 상에서 일반적으로 산재되어 있습니다.
바이트 스트림으로 변환하게 되면 다음과 같은 한 줄로 나열된 데이터로 변환되게 됩니다.
이와 같이 산재되어있던 데이터를 위와 같이 하나의 큰 데이터 덩어리로 뭉쳐서 한 줄로 만들어 저장 및 전송하기 용이한 형태로 변형하는 과정을 직렬화라고 합니다.
이제 유니티에서 어떻게 직렬화를 사용하고 있는지 알아보겠습니다.
흔하게 볼 수 있는 예시는 인스펙터에 표시되는 데이터들입니다.
유니티에서는 Unity Serializer 시스템이 있습니다.
이는 유니티 환경에서 런타임에 더 효괒거으로 돌아가게 하기 위하여 설계된 직렬화 시스템입니다.
여기서 직렬화 가능한 타입들은 float, string, int 같은 기본 타입들은 물론이고 Serializable 어트리뷰트가 붙은 커스텀 클래스 및 구조체가 포함됩니다.
유니티에서 데이터를 직렬화하여 필드에 표시하기 위해서는 아래의 조건을 만족해야 합니다.
퍼블릭이거나 SerializeField 어트리뷰트가 있는 필드
static, const, readonly 불가능
직렬화할 수 있는 필드 타입을 가짐 :
- 기본 데이터 타입(int, double, float, bool, string 등)
- Enum 타입(32비트 이하)
- 고정 크기 버퍼
- Unity 내장 타입(예 : Vector2, Vector3, Rect, Matrix4x4, Color, AnimationCurve)
- Serializable 어트리뷰트가 있는 사용자 정의 클래스 및 구조체
- UnityEngine.Object 에서 파생된 객체에 대한 참조
- 위에어 언급한 필드 타입의 배열 or List<T>
참고 : Unity 는 다중 레벨 타입(다차원 배열, 딕셔너리, 중첩 컨테이너 타입)의 직렬화를 지원하지 않습니다. 이러한 타입을 직렬화하려면 두 가지 옵션이 있습니다.
1. 중첩 타입을 클래스나 구조체로 매핑
2. ISerializationCallbackReceiver 를 구현하여 직렬화 콜백을 사용해 사용자 정의 직렬화 수행
Jagged Array(중첩 타입을 클래스로 매핑)
[Serializable]
public class CustomClassA
{
public CustomJaggedArray jaggedArray;
}
[Serializable]
public class CustomJaggedArray
{
public List<Rows> rows;
[Serializable]
public class Rows
{
public List<int> columns;
}
}
'Unity > 유니티 공부' 카테고리의 다른 글
유니티 - 에셋 관리(Resouces, Asset Bundle, Addressable Asset) (0) | 2024.12.05 |
---|---|
유니티 - 드로우 콜과 배칭 (0) | 2024.12.05 |