예제를 통한 C#의 직렬화 및 역직렬화

⚡ 스마트 요약

C#에서 직렬화는 객체를 바이트 스트림으로 변환하여 파일에 저장하거나 애플리케이션 간에 전송할 수 있도록 합니다. 역직렬화는 객체를 다시 원래 형태로 재구성합니다. 이 문서에서는 예제를 통해 객체 직렬화 및 역직렬화 방법을 배웁니다.

  • 🔄 무엇이다 : 직렬화는 C# 객체를 파일에 쓰고, 역직렬화는 해당 객체를 다시 읽어옵니다.
  • 🏷️ [직렬화 가능]: 클래스를 직렬화하려면 먼저 [Serializable] 속성이 필요합니다.
  • 💾 바이너리 형식: FileStream을 사용하는 BinaryFormatter는 객체를 바이너리 형식으로 기록합니다.
  • 🧩 형식 : C#은 읽기 쉬운 출력을 위해 XML 및 JSON 직렬화도 지원합니다.
  • 🤖 AI 도움말: GitHub Copilot과 같은 AI 도구는 직렬화 코드를 즉시 생성합니다.

C# 직렬화 및 역직렬화

C#의 직렬화 및 역직렬화

직렬화와 역직렬화 개념은 객체와 관련된 데이터를 한 애플리케이션에서 다른 애플리케이션으로 전송해야 할 때마다 사용됩니다. 직렬화는 애플리케이션 데이터를 파일로 내보내는 데 사용됩니다. 그러면 대상 애플리케이션은 역직렬화를 사용하여 데이터를 다시 내보냅니다.trac애플리케이션에서 가져온 데이터를 추가 용도로 사용합니다.

직렬화는 C# 클래스 개체가 파일에 기록되거나 직렬화되는 개념입니다. Tutorial이라는 C# 클래스가 있다고 가정해 보겠습니다. 그리고 클래스에는 ID와 Tutorials 이름이라는 두 가지 속성이 있습니다.

직렬화를 사용하면 Tutorial 클래스의 데이터 속성을 파일에 직접 쓸 수 있습니다. 역직렬화는 파일에서 데이터를 읽고 Tutorial 개체를 다시 구성하는 데 사용됩니다.

C#에서의 직렬화 유형

C#은 여러 직렬화 형식을 지원하며, 데이터가 사용될 위치에 따라 적절한 형식을 선택해야 합니다. 주요 형식은 다음과 같습니다.

  • 이진 직렬화 객체를 압축된 바이너리 스트림으로 변환합니다. 속도는 빠르지만 사람이 읽을 수 있는 형식이 아니며 .NET 환경에 종속적입니다.
  • XML 직렬화 XmlSerializer 클래스를 사용하여 객체의 공개 속성을 읽기 쉬운 XML 파일에 기록합니다.
  • JSON 직렬화 System.Text.Json 또는 Newtonsoft.Json을 사용하여 웹 API에서 가장 일반적인 형식인 경량 JSON을 생성합니다.
  • SOAP 직렬화 기존 웹 서비스를 위해 데이터를 SOAP 메시지 형식으로 변환합니다.

C#에서 개체를 직렬화하는 방법

이를 달성할 수 있는 방법의 예를 살펴보겠습니다.

이 예에서는 코드에서 아래의 상위 수준 단계를 수행하겠습니다.

  1. ID와 Name이라는 두 가지 속성이 있는 Tutorial이라는 클래스를 만듭니다.
  2. 그런 다음 클래스에서 객체를 생성하고 ID 속성에 "1" 값을 할당하고 name 속성에 ".Net" 값을 할당합니다.
  3. 그런 다음 직렬화를 사용하여 위 개체를 example.txt라는 파일로 직렬화합니다.
  4. 마지막으로 역직렬화를 사용하여 파일에서 개체를 역직렬화하고 콘솔에 값을 표시합니다.

콘솔 애플리케이션의 program.cs 파일에 아래 코드를 입력합니다.

단계 1) 수업을 추가합니다.

첫 번째 단계는 직렬화에 사용될 클래스를 추가하는 것입니다.

C#에서 개체 직렬화

Code 설명:-

  1. 직렬화해야 하는 클래스에는 [Serialize] 속성이 있어야 합니다. C#의 키워드입니다. 그런 다음 이 키워드가 Tutorial 클래스에 연결됩니다. 이 속성을 언급하지 않으면 클래스를 직렬화하려고 할 때 오류가 발생합니다.
  2. 다음은 직렬화할 클래스의 정의입니다. 여기서는 "Tutorial"이라는 클래스를 정의하고 2개의 속성을 제공합니다. 하나는 "ID"이고 다른 하나는 "Name"입니다.

단계 2) 객체를 생성합니다.

이 단계에서는 먼저 Tutorial 클래스의 객체를 생성하고 이를 example.txt라는 파일로 직렬화합니다.

C#에서 개체 직렬화

Code 설명:-

  1. 먼저 Tutorial 클래스의 객체를 만듭니다. 그런 다음 ID에 "1" 값을 할당하고 name 속성에 ".net" 값을 할당합니다.
  2. 그런 다음 개체를 직렬화하거나 이진 형식으로 변환하는 데 사용되는 포맷터 클래스를 사용합니다. 직렬화 시 파일의 데이터는 이진 형식으로 수행됩니다. 다음으로 파일 스트림 개체를 만듭니다. 파일 스트림 개체는 쓰기 목적으로 example.txt 파일을 여는 데 사용됩니다. FileMode.Create 및 FileMode.Write 키워드는 쓰기 목적으로 파일을 열어야 함을 구체적으로 언급하는 데 사용됩니다.
  3. 마지막으로 Serialize 메서드를 사용하여 이진 데이터를 파일로 전송합니다. 그런 다음 쓰기 이후 스트림을 닫습니다. 조작 완료되었습니다.

단계 3) 역직렬화를 사용합니다.

마지막으로 데이터가 파일에 있는지 확인하기 위해 역직렬화를 사용하여 파일에서 개체를 역직렬화합니다.

C#에서 개체 직렬화

using System;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
  [Serializable]
  class Tutorial
  {
  public int ID;
  public String Name;
   static void Main(string[] args)
   {
    Tutorial obj = new Tutorial();
    obj.ID = 1;
    obj.Name = ".Net";

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Create,FileAccess.Write);

    formatter.Serialize(stream, obj);
    stream.Close();

    stream = new FileStream(@"E:\ExampleNew.txt",FileMode.Open,FileAccess.Read);
    Tutorial objnew = (Tutorial)formatter.Deserialize(stream);

    Console.WriteLine(objnew.ID);
    Console.WriteLine(objnew.Name);

    Console.ReadKey();
  }
 }
}

Code 설명:-

  1. 우리는 "라는 객체를 생성합니다.흐름”을 클릭하여 읽기 전용 모드로 example.txt 파일을 엽니다.
  2. 그런 다음 개체를 역직렬화하는 데 사용되는 포맷터 클래스를 사용합니다. 이 클래스는 example.txt 파일에 저장되어 있습니다. 반환된 개체는 objnew 개체로 설정됩니다.
  3. 마지막으로 "ID" 및 "name" 속성을 사용하여 "objnew" 개체의 속성을 콘솔에 표시합니다.

위의 코드가 설정되고 프로젝트가 다음을 사용하여 실행되면 비주얼 스튜디오, 아래 출력을 얻게 됩니다.

산출:-

C#에서 개체 직렬화

위의 출력에서 ​​파일의 값이 올바르게 역직렬화되어 콘솔에 표시되었음을 확인할 수 있습니다.

C#에서의 JSON 직렬화

JSON은 최신 애플리케이션과 웹 API에서 가장 널리 사용되는 형식입니다. 내장된 System.Text.Json 네임스페이스는 아래와 같이 단일 메서드 호출로 객체를 직렬화 및 역직렬화합니다.

using System;
using System.Text.Json;
namespace DemoApplication
{
  class Tutorial
  {
    public int ID { get; set; }
    public string Name { get; set; }
  }
  class Program
  {
    static void Main(string[] args)
    {
      Tutorial obj = new Tutorial { ID = 1, Name = ".Net" };
      string json = JsonSerializer.Serialize(obj);
      Console.WriteLine(json);

      Tutorial objnew = (Tutorial)JsonSerializer.Deserialize(json, typeof(Tutorial));
      Console.WriteLine(objnew.Name);
      Console.ReadKey();
    }
  }
}

출력:

{"ID":1,"Name":".Net"}
.Net

자주 묻는 질문

직렬화는 C# 객체를 바이트 스트림(바이너리, XML 또는 JSON)으로 변환하여 파일에 저장하거나 다른 애플리케이션으로 전송할 수 있도록 합니다. 역직렬화는 해당 데이터를 사용하여 객체를 다시 구성합니다.

`[Serializable]` 속성은 해당 클래스의 객체를 직렬화할 수 있도록 클래스를 표시합니다. 이 속성이 없으면 바이너리 직렬화 시 객체를 파일에 쓰려고 할 때 예외가 발생합니다.

C#은 바이너리 직렬화(압축형, .NET 전용), XmlSerializer를 통한 XML 직렬화, System.Text.Json을 통한 JSON 직렬화, 그리고 기존 웹 서비스를 위한 SOAP 직렬화를 지원합니다.

직렬화는 객체의 데이터를 파일이나 스트림에 기록하는 반면, 역직렬화는 해당 데이터를 다시 읽어 메모리에서 원래 객체를 재구성합니다.

BinaryFormatter는 이제 더 이상 사용되지 않으며 역직렬화 과정에서 악성 코드를 실행할 수 있으므로 안전하지 않은 것으로 간주됩니다. Microsoft 새로운 애플리케이션에는 System.Text.Json 또는 XmlSerializer를 사용하는 것을 권장합니다.

GitHub Copilot과 같은 AI 비서는 Serialize 및 Deserialize 호출을 자동 완성하고, [Serializable] 속성을 추가하며, 간단한 주석에서 JSON 또는 XML 직렬화 코드를 생성합니다.

네. AI 기반 도구는 모델 클래스를 생성하고, JSON, XML 및 바이너리 형식 중에서 선택하며, 오류 처리를 추가하여 직렬화 코드가 안전하고 완벽하도록 합니다.

바이너리 직렬화에는 System.Runtime.Serialization.Formatters.Binary를 사용하고, JSON에는 System.Text.Json을 사용하며, XML에는 System.Xml.Serialization을 사용합니다.

이 게시물을 요약하면 다음과 같습니다.