직렬화란 오브젝트 데이터를 연속된 문장형 데이터나 연속된 바이트 데이터로 바꾸는 과정이다.
오브젝트는 메모리에 존재하고 추상적인데 비해서스트링과 바이트 데이터는 드라이브에 저장할수도있고 네트워크 통신으로 stream 도 가능하기 때문이다.
객체의 정보를 보존하고 유지하여 재사용하기 위해 직렬화를 하는 이유라고 보면 된다.
반대로 연속된 문장형 데이터나 연속된 바이트 데이터를 오브젝트 데이터로 바꾸는 과정을 역직렬화라고 한다.
BinaryWriter/Reader, StreamWriter/Reader 는 기본 데이터 형식만 스트림에 읽고 쓸 수 있고,
프로그래머가 직접 정의한 클래스나 구조체와 같은 복합 데이터 형식의 읽기/쓰기는 지원하지 않는다. (이 경우 모든 변수를 저장하는 방법을 정의해야 한다)
이렇게 번거로운 작업을 하지 않고 복합 데이터형식을 저장 및 불러올 수 있도록 도와주는 기능이 객체의 직렬화 이다.
클래스 선언부에 [serializable] 키워드 추가한다.
Private 변수일 경우엔 [serializeField] 키워드를 사용하면 직렬화가 가능하다.
→ 일반적인 변수 선언 후, 직렬화 가능한 클래스를 거쳐서 파일로 저장하게 된다. (로딩할때는 반대로)
✔ 직렬화 하고 싶은 클래스, 구조체 앞에 [Serializabe] 어트리뷰트 정의
✔ Player 클래스에 정의된 멤버 변수들은 직렬화 되어 파일 형태로 저장이 가능함.
✔ 직렬화 대상에서 제외하고 싶은 변수 앞에는 [NonSerialized] 어트리뷰트 정의 (adderss)
✔ 직렬화 할 때 저장도 안되고, 역직렬화 시 불러오기도 되지 않음
[System.Serializable]
public class Player
{
public string name;
public int age;
[System.NonSerialized]
public string address;
}
✔ 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;
}