unity study #7 - 직렬화 & 역직렬화

·2022년 8월 29일
0

Unity Study

목록 보기
7/8

📍 직렬화 & 역직렬화 (Serialization & Deserialization)

직렬화란 오브젝트 데이터를 연속된 문장형 데이터나 연속된 바이트 데이터로 바꾸는 과정이다.

오브젝트는 메모리에 존재하고 추상적인데 비해서스트링과 바이트 데이터는 드라이브에 저장할수도있고 네트워크 통신으로 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
  • 추상클래스

직렬화 구현

  1. 데이터 및 변수 선언, 값 할당
  2. serializable 클래스 선언
  3. System.OI FileStream 클래스를 통해 파일로 생성
  4. serializable 클래스에 1의 데이터 담기
  5. 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;
}
profile
삶을 스스로 통제하고 있다는 느낌을 받을 때 더 행복하고 성공한다.🍃

0개의 댓글