SerializableAttribute 클래스는 해당 클래스가 직렬화가 될 수 있음을 나타내며 상속될 수 없습니다. 여기서 직렬화란 객체를 저장매체에 저장하거나 바이너리의 형태로 전달하기 위해 나중에 재구성(역직렬화) 할 수 있는 형태로 변환하는 것을 의미합니다.

 

이를 통해서 객체의 상태를 원본 그대로 유지하고(영속성) 필요할 때 다시 생성할 수 있습니다. 또한, 네트워크를 통해 전달이 가능해집니다.

 

이때 직렬화의 유형은 여러 가지가 있습니다. 예를 들어 Binray, CSV, XML, JSON 등이 있습니다. 아래 예제에서는 Binray 유형을 통해 직렬화를 진행하였습니다. 여기서는 간단하게 이해만 하고 본인의 상황에 맞는 유형을 선택해 사용하면 되겠습니다.

 

이제 예제를 통해 자세히 알아보겠습니다.

 

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

public class Test {
   public static void Main()  {

      // Creates a new TestSimpleObject object.
      TestSimpleObject obj = new TestSimpleObject();

      Console.WriteLine("Before serialization the object contains: ");
      obj.Print();

      // Opens a file and serializes the object into it in binary format.
      Stream stream = File.Open("data.xml", FileMode.Create);
      BinaryFormatter formatter = new BinaryFormatter();

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

      // Empties obj.
      obj = null;

      // Opens file "data.xml" and deserializes the object from it.
      stream = File.Open("data.xml", FileMode.Open);
      formatter = new BinaryFormatter();

      obj = (TestSimpleObject)formatter.Deserialize(stream);
      stream.Close();

      Console.WriteLine("");
      Console.WriteLine("After deserialization the object contains: ");
      obj.Print();
   }
}

// A test object that needs to be serialized.
[Serializable()]
public class TestSimpleObject  {

    public int member1;
    public string member2;
    public string member3;
    public double member4;

    // A field that is not serialized.
    [NonSerialized()] public string member5;

    public TestSimpleObject() {

        member1 = 11;
        member2 = "hello";
        member3 = "hello";
        member4 = 3.14159265;
        member5 = "hello world!";
    }

    public void Print() {

        Console.WriteLine("member1 = '{0}'", member1);
        Console.WriteLine("member2 = '{0}'", member2);
        Console.WriteLine("member3 = '{0}'", member3);
        Console.WriteLine("member4 = '{0}'", member4);
        Console.WriteLine("member5 = '{0}'", member5);
    }
}

 

크게 어려운 내용은 없습니다. TestSimpleObject 객체의 데이터들을 직렬화 하기 전에 출력하고 직렬화한 뒤 객체를 비워줍니다. 이후, 직렬화 한 데이터를 가지고 와서 역직렬화를 거친 데이터를 다시 출력하는 코드입니다. 다만, member5의 경우 [NonSerialized()] 선언을 통해 직렬화를 하지 않도록 만들었습니다. 실제 코드를 실행하면 아래와 같습니다.

 

Before serialization the object contains: 
member1 = '11'
member2 = 'hello'
member3 = 'hello'
member4 = '3.14159265'
member5 = 'hello world!'

After deserialization the object contains: 
member1 = '11'
member2 = 'hello'
member3 = 'hello'
member4 = '3.14159265'
member5 = ''

 

본문 코드에서 직렬화를 피하도록 설정한 member5를 제외한 나머지 변수들은 제대로 역직렬화 과정을 거쳐 값이 출력되는 것을 확인할 수 있습니다.

 

- 참조

1. 위키

2. Microsoft Docs

 

'프로그래밍 > C#' 카테고리의 다른 글

[C#] Boxing과 Unboxing  (0) 2021.03.15
[C#] 값형식과 참조형식의 예시  (1) 2021.03.15
[C#] var 데이터 형식  (0) 2021.03.15
[C#] Null 조건 부 연산자  (1) 2020.12.26
[C#] out, ref 키워드 살펴보기  (0) 2020.09.24
블로그 이미지

NIA1995

,