C#

[C#] 직렬화 역직렬화

Prooni 2024. 10. 16. 16:10

안녕하세요~

오늘은 C# 직렬화, 역직렬화에 대해 공부해요!

 

저번시간에 공부했던

BinaryWriter, BinaryReader / StreamWriter, StreamReader

기억나시나요?

 

가물가물하시다면 아래 게시물이 도움될거에요!

https://unityking.tistory.com/36

 

[C#] 파일 다루기

안녕하세요~오늘은 C# 파일 다루기에 대해 공부해요! 파일 : 컴퓨터 저장 매체에 기록되는 데이터의 묶음디렉터리 : 파일이 위치하는 주소 .NET에서 파일과 디렉터리를 다루기 위해 제공하는 클

unityking.tistory.com

 

BinaryWriter, BinaryReader / StreamWriter, StreamReader 클래스는

기본 데이터 형식을 스트림에

쓰고 읽을 수 있는 메소드를 제공하지만

프로그래머가 직접 정의한 클래스나 구조체 같은

복합 데이터 형식은 지원하지 않아요.

 

C#은 복합 데이터 형식을 스트림에

쉽게 읽고 쓸 수 있게 하는

직렬화(Serialization)을 제공해요.

 

직렬화란 객체의 상태(필드값)를

메모리나 영구 저장 장치에 저장이 가능한

0과 1의 순서로 바꾸는 것을 말해요

 

 

직렬화할 프로퍼티를 클래스에서

public으로 한정하면 끝이에요!

 

아래처럼 NameCard의 프로퍼티를 public으로 한정하고

JsonSerializer를 통해 저장할 수 있어요!

JsonSerializer는 System.Text.Json 네임스페이스 소속이고

객체를 Json형식으로 직렬화 또는 역직렬화해줘요.

class NameCard
{
    public string Name { get; set; }
    public string Phone { get; set; }
    public int Age { get; set; }
}

class MainApp
{
    static void Main(string[] args)
    {
        var fileName = "a.json";

        using (Stream ws = new FileStream(fileName, FileMode.Create))
        {
            NameCard nc = new NameCard()
            {
                Name = "박상현",
                Phone = "010-123-4567",
                Age = 33

            };

            string jsonString = JsonSerializer.Serialize<NameCard>(nc);
            byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
            ws.Write(jsonBytes, 0, jsonBytes.Length);
        }

        using (Stream rs = new FileStream(fileName, FileMode.Open))
        {
            byte[] jsonBytes = new byte[rs.Length];
            rs.Read(jsonBytes, 0, jsonBytes.Length);

            string jsonString = System.Text.Encoding.UTF8.GetString(jsonBytes);

            NameCard nc2 = JsonSerializer.Deserialize<NameCard>(jsonString);

            Console.WriteLine($"Name:   {nc2.Name}");
            Console.WriteLine($"Phone:   {nc2.Phone}");
            Console.WriteLine($"Age:   {nc2.Age}");
        }
    }
}

 

 

직렬화 하고 싶지 않은 프로퍼티에 대해서는

아래처럼

[JsonIgnore] 애트리뷰트로 수식해주면 된답니다.

class NameCard
{
    public string Name { get; set; }
    public string Phone { get; set; }
    
    [JsonIgnore]
    public int Age { get; set; }
}

 

 

List와 같은 컬렉션들도 직렬화를 지원해요

바로 예제 코드 추가할게요.

class NameCard
{
    public string Name { get; set; }
    public string Phone { get; set; }
    public int Age { get; set; }
}

class MainApp
{
    static void Main(string[] args)
    {
        var fileName = "a.json";

        using (Stream ws = new FileStream(fileName, FileMode.Create))
        {
            var list = new List<NameCard>();
            list.Add(new NameCard() { Name = "박상현", Phone = "010-123-4567", Age = 22 });
            list.Add(new NameCard() { Name = "김연아", Phone = "010-323-1111", Age = 22 });
            list.Add(new NameCard() { Name = "장미란", Phone = "010-555-5555", Age = 22 });

            string jsonString = JsonSerializer.Serialize<List<NameCard>>(list);
            byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
            ws.Write(jsonBytes, 0, jsonBytes.Length);
        }

        using (Stream rs = new FileStream(fileName, FileMode.Open))
        {
            byte[] jsonBytes = new byte[rs.Length];
            rs.Read(jsonBytes, 0, jsonBytes.Length);
            string jsonString = System.Text.Encoding.UTF8.GetString(jsonBytes);

            var list2 = JsonSerializer.Deserialize<List<NameCard>>(jsonString);
            foreach (NameCard nc in list2)
            {
                Console.WriteLine($"Name : {nc.Name} Phone : {nc.Phone} Age : {nc.Age}");
            }
        }
    }
}

'C#' 카테고리의 다른 글

[C#] Thread  (1) 2024.10.18
[C#] 파일 다루기  (0) 2024.10.16
[C#] Dynamic 형식  (2) 2024.10.15
[C#] 리플렉션과 애트리뷰트  (1) 2024.10.14
[C#] LINQ  (1) 2024.10.13