닷넷에서 직렬화/역직렬화 방식은 3가지가 있다.
1. BinaryFormatter
2. XmlSerializer
3. DataContractJsonSerializer // 참고 MSDN : DataContractJsonSerializer 클래스 (System.Runtime.Serialization.Json) | Microsoft Docs
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; // 중단점.
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
[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}";
}
}
'C#' 카테고리의 다른 글
[C#] TCP Socket을 이용한 통신 (0) | 2020.12.04 |
---|---|
[C#] 8.0 고성능이 필요한 환경에서 GC가 발생하지 않는 네이티브 힙 사용 (0) | 2020.12.01 |
[C#] BCL MemoryStream, StreamWriter/Reader, BinaryWriter/Reader (0) | 2020.11.29 |
[C#] BCL Regex 정규식을 이용한 이메일 규칙 판별 (0) | 2020.11.29 |
[C#] BCL Encoding 타 언어 프로그램과 데이터 주고 받기 (0) | 2020.11.29 |