나 개발자 진짜 되냐?

[ 10月 2日 ] 오늘 내가 배운 것 _ 14日次 본문

오늘 공부를 정리해봐요!

[ 10月 2日 ] 오늘 내가 배운 것 _ 14日次

Snow Rabbit 2024. 10. 2. 23:41

 

이번 프로젝트를 진행하며

해보고 싶은 부분을 도전해 보고

해 나가면서

 

뿌듯함을 느꼈다.

 

사실 나는 UI담당을 맡아

 

색을 집어넣어

생명을 불어다 주고 있다.

 

코드 짜는 거만큼 UI수정도 굉장히 힘들다는 사실을 알았다.

 

이번에는

오늘 공부한

직렬화에 대해 조금 정리하고 넘어가려고 한다.


왜 공부했는가

 

마지막 순서 발표라며

팀원분들이 우리의 작품이 초라하진 않을까

내심 걱정하시는 거 같아 보여서

 

피날레가 필요하다는 생각에

나는 게임을 저장하는 기능이 만들어보고 싶어 졌다.

 

그리고 별로 안 어려울 줄 알았다.

 

근데 그렇진 않았다.

근데 코드를 하나하나 해석할 시간은 아직 없고..

이런 코드를 통하면

게임을 저장하고 불러올 수 있구나 를 알게 되었다.


직렬화

그의 이름

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);

 

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

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

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

 

아 이거 일급비밀인데..

 

.

.

.

.

.

 

이 비밀은 따로 정리하겠습니다 ㅎㅅㅎ

 

오늘 나,

UI 꾸미느라 고생하겠지만

파이팅!

 

https://qua28.tistory.com/150

 

[ C# 중급 문법 24 ] 직렬화 Serialization & 역직렬화 Deserialization

이번에 큰마음 먹고 시작한게임 저장기능.. 저장과 불러오기를 통해알게된 직렬화 자바에 있다던..자바에서는 쉽다던..하지만 여기선..쉽지않은직렬화!!!  그 친구에 대해 탐구해보자.직렬화

qua28.tistory.com