본문 바로가기
C#

[C#] BCL DataContractJsonSerializer을 이용한 객체 JSON 직렬화

by Jcoder 2020. 11. 30.

DataContractJsonSerializer를 이용한 객체 직렬화

 

닷넷에서 직렬화/역직렬화 방식은 3가지가 있다.

   1. BinaryFormatter

   2. XmlSerializer

   3. DataContractJsonSerializer // 참고 MSDN : DataContractJsonSerializer 클래스 (System.Runtime.Serialization.Json) | Microsoft Docs

 

DataContractJsonSerializer 클래스 (System.Runtime.Serialization.Json)

개체를 JSON(JavaScript Object Notation)으로 직렬화하고 JSON 데이터를 개체로 역직렬화합니다.Serializes objects to the JavaScript Object Notation (JSON) and deserializes JSON data to objects. 이 클래스는 상속될 수 없습니

docs.microsoft.com

 

1. BinaryFormatter

* 2진 데이터로 직렬화하기 때문에 기타 다른 직렬화 방법에 비해 속도가 빠르고 용량도 작다.

* 직렬화 방식이 닷넷 내부에서 고유하게 정의돼 있어 자바와 같은 다른 언어에서 그 바이트 배열을 어떻게 역직렬화해야 원본 데이터를 복원할 수 있는지 알 수 없다. 고로 닷넷 응용 프로그램끼리 데이터를 교환해야 할때 사용한다.

 

2. XmlSerializer

* 기본적으로 UTF-8 인코딩으로 객체를 문자열로 직렬화한다. 그래서 다른 언어 응용 프로그램과 쉽게 주고 받을 수 있다.

* 그렇지만 문자열의 크기가 크기 때문에 BinaryFormatter에 비해 속도가 느리고 용량도 크다.

 

3. DataContractJsonSerializer

* 아래 코드와  ms의 길이를 보면 1, 2의 장점만을 받아온 것을 확인할 수 있다.

* 용량도 작고 문자열로 되어 있고 다른 언어와도 쉽게 데이터를 주고 받을 수 있다.

 

class Program

{

    static void Main(string[] args)

    {

        Console.WriteLine("System.Runtime.Serialization.Json.DataContractJsonSerializer를 이용한 객체 직렬화");

 

        System.Runtime.Serialization.Json.DataContractJsonSerializer jsonSerializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(Person));

 

        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())

        {

        Person person = new Person(26, "홍길동");

 

        jsonSerializer.WriteObject(ms, person);

        ms.Position = 0; // 중단점.

길이가 29인 MemoryStream

        Person person2 = jsonSerializer.ReadObject(ms) as Person;

        Console.WriteLine(person2);

        Console.WriteLine(System.Text.Encoding.UTF8.GetString(ms.ToArray()));

        }

    }

}

// 참고 MSDN : DataContractAttribute 클래스 (System.Runtime.Serialization) | Microsoft Docs

 

DataContractAttribute 클래스 (System.Runtime.Serialization)

형식이 데이터 계약을 정의하거나 구현하며, DataContractSerializer와 같은 serializer를 통해 serialize할 수 있도록 지정합니다.Specifies that the type defines or implements a data contract and is serializable by a serializer,

docs.microsoft.com

[System.Runtime.Serialization.DataContract]

public class Person

{

    [System.Runtime.Serialization.DataMember]

    public int Age;

    [System.Runtime.Serialization.DataMember]

    public string Name;

 

    public Person(int age, string name)

    {

        this.Age = age;

        this.Name = name;

    }

 

    public override string ToString()

    {

        return $"{Age}{Name}";

    }

}