직렬화/역직렬화란?
직렬화(Serialization)
객체를 저장 가능한 형식(텍스트 혹은 이진 데이터)로 바꾸는 과정이다.
C#에서 class,List,string,int와 같은 객체의 상태를 문자열(JSON)로 바꾼다. 쉽게 말하면 메모리에 있는 데이터를 파일로 저장할 수 있게끔 바꾸는 것이다.
try
{
// 직렬화
GameSaveState saveState = new GameSaveState(player, inventory, items);
string saveJson = JsonSerializer.Serialize(saveState, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText("player.json", saveJson, Encoding.UTF8); // 실제 JSON문자열을 파일에 저장
Console.WriteLine("저장 완료 player.json");
}
catch (Exception ex)
{
Console.WriteLine($"저장 실패 {ex.Message}");
}
역직렬화(Deserialization)
직렬화와 반대로 JSON에 있는 문자열을 다시 객체로 복원하는 과정이다. 다시 코드에서 쓸 수 있는 객체로 바꾸는 것이다.
if (File.Exists("player.json"))
{
// 파일 읽고 역직렬화
string json = File.ReadAllText("player.json", Encoding.UTF8); // JSON파일 읽기
GameSaveState saveState = JsonSerializer.Deserialize<GameSaveState>(json); // 객체 복원
// 객체에 할당
...
Console.WriteLine("[불러오기 성공]");
}
else // 플레이어 정보가 없었을 경우
{
...
}
직렬화/역직렬화때 발생한 문제들
01 Tuple 사용 불가
public Tuple<string, int> effect;
System.Text.Json은 Tuple을 역직렬화 할 수 없다. 왜냐하면 Tuple에는 기본 생성자가 없다.
직렬화는 가능하지만, JSON을 다시 객체로 복원할 수 없다.
Tuple에 왜 기본생성자가 없어요?
Tuple은 클래스를 따로 정의하지 않아도 여러 값을 하나로 묶기 위한 읽기 전용 객체. 이때 값이 없으면 의미도 없고 기능도 상실하기 때문에 빈 상태로 만들 수 없도록 기본생성자가 존재 하지 않는다. 그러므로 Tuple의 Item1,Item2는 get만 있고 set이 없다.
그래서 별도의 클래스로 관리하였다.
public class Effect
{
public string type { get; set; }
public int value { get; set; }
public Effect() { }
public Effect(string type, int value)
{
this.type = type;
this.value = value;
}
}
02 프로퍼티없이 필드만 쓸 경우 역직렬화가 불안정하다.
직렬화는 가능하지만 역직렬화는 불안정하거나 실패할 수 있다.
public string name;
System.Text.Json은 기본적으로 public 필드도 지원하긴 하지만 역직렬화시 더 안정적인 것은 프로퍼티사용이다.
public string Name { get; set; }
프로퍼티란?
외부에서 안전하고 통제된 방식으로 데이터를 읽고 쓰는 문법이다. 즉 공식적인 데이터 접근 경로
03 한글이 깨지는 경우
"name": "\uC218\uB828\uC790 \uAC11\uC637"
한글은 유니코드 형식으로 저장된다. JSON표준에서는 문제가 없지만 사람이 보기 불편하거나 저장 시 깨질 수 있다.
그래서 UTF-Encoding 추가
// 저장 시
File.WriteAllText("파일.json", json, new UTF8Encoding(true));
// 읽을 때
string json = File.ReadAllText("파일.json", Encoding.UTF8);
04 기본 생성자
역직렬화할때 기본 생성자가 꼭 필요하다.
역직렬화 과정
1. 기본 생성자로 빈 객체 생성
2. JSON 값을 프로퍼티에 하나씩 채워넣음
즉 System.Text.Json객체를 먼저 생성해야 속성을 넣을 수 있다. 그런데 생성자가 없으면 객체를 만들 수 없다. 그러므로 역직렬화가 실패한다.
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - 디버그 프로필에 지정된 디버그 실행 파일 .exe가 없습니다 에러 (0) | 2025.04.21 |
---|---|
Unity - 점과 직선사이의 거리를 구해보자(벡터 투영 공식 활용) (0) | 2025.04.10 |
Unity - Unity 개발자가 왜 C++을 알아야할까? (0) | 2025.04.08 |
Unity - Batching과 함께 알아보는 Frame, LifeCycle, DrawCall (0) | 2025.04.07 |
Unity - 쉐이더 분홍색(핑크색) 오류 해결 방법 (1) | 2025.03.13 |
댓글