나 개발자 진짜 되냐?

[ C# 기본 문법 24 ] 직렬화 Serialization & 역직렬화 Deserialization 본문

C# 을 맛보았어요!/문법정리를 해보았어요!

[ C# 기본 문법 24 ] 직렬화 Serialization & 역직렬화 Deserialization

Snow Rabbit 2024. 10. 2. 23:46

 

 

이번에 큰마음 먹고 시작한

게임 저장기능..

 

저장과 불러오기를 통해

알게된 직렬화

 

자바에 있다던..

자바에서는 쉽다던..

하지만 여기선..쉽지않은

직렬화!!!

 

 

그 친구에 대해 탐구해보자.


직렬화

그의 이름

Serialization

 

지속하거나, 전송할 수 있는 형태로 개체 상태를 변환하는 프로세스

 

상태를 변환?

그러면 다시 원상복귀 시켜주는 친구도 있나?

 

역직렬화

그의 이름

Deserialization

 

누군가가 나에게 아주 쉽고 간단하게 

알려준 적이 있다.

 

직렬화랑 역직렬화는

 

김밥을 말이야

하나하나 분해해서

김, 밥, 햄, 단무지, 시금치, 당근, 계란

이거 다 분해해서 어디 뒀다가

 

다시 하나하나 다 합쳐서

다시 김밥을 만들어내는 게

직렬화와 역직렬화라고..

 

누군가는 왜 하필 김밥이냐..

이런 생각을 했을 수 있지만

 

아무렴,

 

나는 바로 상상하며 깨달았다.

 

데이터를 분해해서 저장해 두었다가

필요할 때 다시 다 가져와서 합치는 작업이라는 걸

 


직렬화의 종류는

 

1. 바이너리 직렬화 (Binary Serialization)

데이터를 바이트 배열로 변환하기 때문에 매우 효율적이며,

네트워크 전송 또는 파일 저장에 주로 사용

 

=== 장점 ===

크기가 작고

성능이 우수하며

객체의 전체 상태(예: 참조형 필드)도

함께 직렬화할 수 있습니다.

 

=== 단점 ===

인간이 읽기 어려우며

시스템 간의 호환성이 떨어질 수 있고

보안문제가 있어서 잘 사용 안 한다.

 

 

2. XML 직렬화 (XML Serialization)

객체를 XML 형식으로 직렬화하는 방식

독립적이고 가독성이 뛰어나며,

사람이 읽고 수정하기 쉽다.

 

=== 장점 ===

가독성이 좋고

시스템 간 데이터 전송에 적합하며,

많은 시스템에서 표준으로 사용됩니다.

 

=== 단점 ===

바이너리 직렬화보다

데이터 크기가 크고 성능이 낮다.

또한,

복잡한 개체 그래프(순환 참조 등)는

직렬화할 수 없습니다.

 

 

 

3. JSON 직렬화 (JSON Serialization)

객체를 JSON(JavaScript Object Notation) 형식으로 직렬화하는 방식

가볍고,

XML보다 데이터 크기가 작으며,

다양한 환경에서 널리 사용되고 있다.

=== 장점 ===

사람이 읽기 쉬우며

다양한 프로그래밍 언어에서 쉽게 파싱하고 생성할 수 있다.

데이터 전송에 널리 사용되는 중!

=== 단점 ===

XML보다 읽기 쉬우나,

바이너리 직렬화보다는 성능이 떨어진다.

 

그 이외에,

SOAP 직렬화

뭐 커스텀직렬화

프로토콜 버퍼 등등이 있지만

 

JSON친구가

제일이라는 거!

 

아니 그러면 어떻게 C#에서 사용할까!?


직렬화를 사용한 경우

클래스를 만들어주고

 

public class SaveSystem
{
    // 데이터를 JSON 파일로 저장하는 메서드
    public static void SaveData(Data data, string filePath)
    {
        // Data 객체를 JSON 문자열로 변환
        string jsonString = JsonSerializer.Serialize(data);
        
        // JSON 문자열을 파일에 저장
        File.WriteAllText(filePath, jsonString);
        Console.WriteLine("DATA saved successfully!");
    }

 

아! Json친구에 오류가 난다고요?

그것은.. Json친구를 다운로드하여주어야 합니다.

 

즉,

이 친구가 없으면 의미가 없다.

 

다음!

JsonSerializer.Serialize(data);

이 친구 덕에 문자열로 반환해서

file에 저장해 준다.

다해주면 데이터 저장 잘했소!라고 출력

 

 

저장했으면 불러와야죠!

    public static Data LoadData(string filePath)
    {
        // 파일이 존재하는지 확인
        if (File.Exists(filePath))
        {
            // 파일에서 JSON 문자열을 읽어옴
            string jsonString = File.ReadAllText(filePath);
            
            // JSON 문자열을 GameData 객체로 변환 (역직렬화)
            Data data = JsonSerializer.Deserialize<Data>(jsonString);
            Console.WriteLine("Data loaded successfully!");
            return data;
        }
        else
        {
            Console.WriteLine("Save file not found!");
            return null;
        }
    }
}

JsonSerializer.Deserialize <Data>(jsonString);

이 친구로 아까 저장했던 파일을 역직렬화하면서

문자열 소로로록 가져와서

다시 김밥으로 만들어버리기!

 


자 구현은 어떻게 할까??

 

어렵지 않다.

 

저장은 이렇게

 GameData loadedData = SaveSystem.LoadGame(saveFilePath);

 

불러오기는 이렇게

 SaveSystem.SaveData(Data, saveFilePath);

 

근데 이렇게 해주면 문제가 생긴다

문자열로 스르륵스르륵 해주다 보니

리스트, 클래스는 해주는 방식이 따로 있다.

 

 

바로 클래스 맨위에

[Serializable]

쓰기 입니다.

 

아쒸..너무 쉽다구요?

저도 그렇게 생각합니다.

 

그리고 이 친구가 쓰이는 클래스에

변수들은

get & set이

필수

입니다.

 

[Serializable]
public class PlayerInventory
{
    public string ItemName { get; set; }
    public int Quantity { get; set; }
}

[Serializable]
public class GameData
{
    public string PlayerName { get; set; }
    public int Level { get; set; }
    public int Health { get; set; }
    public string Location { get; set; }

    // 플레이어의 인벤토리 같은 추가적인 데이터
    public PlayerInventory Inventory { get; set; }
}

 

이렇게만 해주면

너도나도

저장하고 불러오기

파워 가능!