[c#] C# 직렬화 이해하기

C#에서는 데이터를 파일에 쓰거나 네트워크를 통해 전송하기 위해 직렬화(serialization)라는 개념을 사용합니다. 직렬화는 객체를 일련의 바이트로 변환하여 저장하거나 전송할 수 있도록 하는 프로세스입니다.

직렬화의 이점

데이터 저장 및 전송

직렬화를 통해 객체를 파일에 저장하거나 네트워크를 통해 다른 시스템으로 전송할 수 있습니다.

상속 및 다형성

직렬화를 사용하면 클래스 간의 상속 및 다형성을 유지하면서 객체를 저장하고 전송할 수 있습니다.

데이터 보안

직렬화를 통해 데이터를 암호화하거나 서명하여 보안성을 유지할 수 있습니다.

C#에서의 직렬화 방법

C#에서는 BinaryFormatter, XmlSerializer, DataContractSerializer, JSON.NET(Newtonsoft.Json) 등의 라이브러리를 사용하여 직렬화를 수행할 수 있습니다.

BinaryFormatter

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class Program
{
    static void Main()
    {
        // Serialize
        var obj = new SomeClass();
        var formatter = new BinaryFormatter();
        
        using (var stream = new FileStream("data.bin", FileMode.Create))
        {
            formatter.Serialize(stream, obj);
        }

        // Deserialize
        using (var stream = new FileStream("data.bin", FileMode.Open))
        {
            var deserializedObj = (SomeClass)formatter.Deserialize(stream);
        }
    }
}

[Serializable]
public class SomeClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}

XmlSerializer

using System;
using System.IO;
using System.Xml.Serialization;

public class Program
{
    static void Main()
    {
        // Serialize
        var obj = new SomeClass();
        var serializer = new XmlSerializer(typeof(SomeClass));

        using (var stream = new FileStream("data.xml", FileMode.Create))
        {
            serializer.Serialize(stream, obj);
        }

        // Deserialize
        using (var stream = new FileStream("data.xml", FileMode.Open))
        {
            var deserializedObj = (SomeClass)serializer.Deserialize(stream);
        }
    }
}

public class SomeClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}

DataContractSerializer

using System;
using System.IO;
using System.Runtime.Serialization;

public class Program
{
    static void Main()
    {
        // Serialize
        var obj = new SomeClass();
        var serializer = new DataContractSerializer(typeof(SomeClass));

        using (var writer = XmlWriter.Create("data.xml"))
        {
            serializer.WriteObject(writer, obj);
        }

        // Deserialize
        using (var stream = new FileStream("data.xml", FileMode.Open))
        {
            var deserializedObj = (SomeClass)serializer.ReadObject(stream);
        }
    }
}

[DataContract]
public class SomeClass
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
}

JSON.NET(Newtonsoft.Json)

using System;
using System.IO;
using Newtonsoft.Json;

public class Program
{
    static void Main()
    {
        // Serialize
        var obj = new SomeClass();
        var json = JsonConvert.SerializeObject(obj);
        File.WriteAllText("data.json", json);

        // Deserialize
        var deserializedObj = JsonConvert.DeserializeObject<SomeClass>(File.ReadAllText("data.json"));
    }
}

public class SomeClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}

결과

직렬화를 통해 객체를 파일에 저장하거나 네트워크를 통해 전송할 수 있으며, C#에서는 다양한 방법으로 직렬화를 수행할 수 있습니다. 이를 활용하여 데이터 관리와 전송을 보다 효율적으로 처리할 수 있습니다.

참고 자료