본문 바로가기
유니티 공부/Unity

C# - JSON 파일 직렬화/역직렬화시 주의 사항 정리(Tuple, 프로퍼티, 한글이 깨지는 경우)

by 코딩하는 돼징 2025. 4. 15.
반응형

직렬화/역직렬화란?

 

직렬화(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객체를 먼저 생성해야 속성을 넣을 수 있다. 그런데 생성자가 없으면 객체를 만들 수 없다. 그러므로 역직렬화가 실패한다.

 

 

반응형

댓글