직렬화란 오브젝트 데이터를 연속된 문장형 데이터나 연속된 바이트 데이터로 바꾸는 과정이다.
오브젝트는 메모리에 존재하고 추상적인데 비해서
스트링과 바이트 데이터는 드라이브에 저장할수도있고 네트워크 통신으로 stream 도 가능하기 때문이다.
객체의 정보를 보존하고 유지하여 재사용하기 위해 직렬화를 하는 이유라고 보면 된다.
반대로 연속된 문장형 데이터나 연속된 바이트 데이터를 오브젝트 데이터로 바꾸는 과정을 역직렬화라고 한다.
BinaryWriter/Reader, StreamWriter/Reader 는 기본 데이터 형식만 스트림에 읽고 쓸 수 있고,
프로그래머가 직접 정의한 클래스나 구조체와 같은 복합 데이터 형식의 읽기/쓰기는 지원하지 않는다.
(이 경우 모든 변수를 저장하는 방법을 정의해야 한다)
이렇게 번거로운 작업을 하지 않고 복합 데이터형식을 저장 및 불러올 수 있도록 도와주는 기능이 객체의 직렬화 이다.
직렬화
클래스 선언부에 [serializable] 키워드 추가한다.
Private 변수일 경우엔 [serializeField] 키워드를 사용하면 직렬화가 가능하다.
직렬화 가능한 것
- pubilc 이거나 serializeField 속성이 있어야 함
- 기본 데이터 타입 (‘int’, ‘float’, ‘double’, ‘bool’, ‘string’ 등)
- 유니티 내장 타입 vector2, vector3, vector4, Rect, Quaternion, Matrix4x4, Color, Color32, LayerMask, AnimationCurve, RectOffset, GUIStyle
- 열거형 타입
직렬화 할 수 없는 것
- static, const, readonly, fieldtype
- 추상클래스
직렬화 구현
- 데이터 및 변수 선언, 값 할당
- serializable 클래스 선언
- System.OI FileStream 클래스를 통해 파일로 생성
- serializable 클래스에 1의 데이터 담기
- BinaryFomatter 클래스를 이용하여 2번을 serialize 하여 3의 파일로 생성
→ 일반적인 변수 선언 후, 직렬화 가능한 클래스를 거쳐서 파일로 저장하게 된다. (로딩할때는 반대로)
클래스, 구조체에 직렬화 적용
✔ 직렬화 하고 싶은 클래스, 구조체 앞에 [Serializabe] 어트리뷰트 정의
✔ Player 클래스에 정의된 멤버 변수들은 직렬화 되어 파일 형태로 저장이 가능함.
✔ 직렬화 대상에서 제외하고 싶은 변수 앞에는 [NonSerialized] 어트리뷰트 정의 (adderss)
✔ 직렬화 할 때 저장도 안되고, 역직렬화 시 불러오기도 되지 않음
[System.Serializable]
public class Player
{
public string name;
public int age;
[System.NonSerialized]
public string address;
}
직렬화 할 수 없는 클래스 객체 (PlayerStats) 처리
✔ PlayerStats 클래스는 Serializable 설정이 안되어 있기 때문에 PlayerStats 클래스도 Serializable 로 직렬화 설정을 해주거나
Player 내부에 선언된 PlayerStats 객체를 NonSerialized 해줘야 한다.
✔ Player 클래스 내부에 선언된 PlayerStats 클래스 인스턴스는, Inspector view에 주소 값을 설정할 수 있도록 표시되는데
PlayerStats가 직렬화 되어 있다면 값을 설정할 수 있도록 PlayerStats 내부의 public 멤버변수가 모두 보여진다.
public class PlayerStats
{
public int maxHP;
}
[System.Serializable]
public class Player
{
public PlayerStats playerStats;
public string name;
public int age;
[System.NonSerialized]
public string address;
}
'게임개발 > 게임 UI.UX 프로그래밍' 카테고리의 다른 글
Input 필드 UI만들기 (0) | 2024.02.07 |
---|---|
로딩바 만들기 (0) | 2024.02.07 |
스위치버튼, 탭 메뉴 UI 만들기 (0) | 2024.02.06 |
동기 비동기 (0) | 2024.02.05 |
유니티 싱글톤 패턴 (0) | 2024.02.05 |