[C#] Serialization & Deserializaton
직렬화(Serialization)와 역직렬화(Deserialization)는 데이터의 저장 및 전송을 용이하게 하기 위해 데이터를 변환하는 것
1. 직렬화 (Serialization)
직렬화는 객체 / 데이터를 바이트등의 형태로 변환하여 저장/전송 할 수 있도록 하는 과정
- 대표적 직렬화 방식
- Json
- Xml
- Binary
- 사용 예시
- 파일 저장
- 네트워크로 객체 전송
2. 역직렬화 (Deserialization)
직렬화된 데이터를 다시 객체로 복원하는 과정
저장된 바이트나 문자열을 다시 객체로 불러오는 것
C# Json직렬화 예시
- 기본 코드
string filepath = "filepath.json";
string json = JsonSerializer.Serialize(objects)
File.WriteAllText(filepath, json);
- 작성된 파일이 읽기 편했으면 좋겠을 때
```C#
string json = JsonSerializer.Serialize(Objects, new JsonSerializerOptions{WriteIndented=true})
- 작성된 파일이 한글이 깨져 보일 때
var options = new JsonSerializerOptions { Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping, WriteIndented = true }; string json = JsonSerializer.Serialize(Object,options)
C# Json역직렬화 예시
기본 코드
string jsonString = File.ReadAllText(filePath); T obj = JsonSerializer.Deserialize<T>(jsonString);
제약
- setter가 private이거나 없으면 역 직렬화가 불가능함
- 생성자가 여러개 일 때, 매개변수가 없는 pubilc 생성자를 우선 사용함
- 매개변수가 있는 생성자가 유일한 생성자일 때 해당 생성자를 사용함
제약을 해소하는 방법
- 변경할 수 없는 형식 및 속성 사용 - .NET | Microsoft Learn
[JsonInclude]
[JsonConstructor]
[JsonPropertyName("Name")]
- 변경할 수 없는 형식 및 속성 사용 - .NET | Microsoft Learn
[JsonInclude]
pubilc이 아닌 property나 field도 직렬화/역직렬화 시 포함되도록 함
public class Forecase { public DateTime Date{get; init;} [JsonInclude] // private도 직렬화/역직렬화시 포함되도록 함 public int Temperature{get;private set;} // 원래는 역직렬화 불가능 [JsonInclude] pubilc string? Summary{private get; set;} // 원래는 직렬화 불가능 }
[JsonConstructor]
생성자가 여러개 일 때 지정한 생성자로 객체를 초기화 할 수 있도록 함
public class Forecase { public DateTime Date{get;} // 역직렬화 불가능 public int Temperature{get;} // 역직렬화 불가능 pubilc string? Summary{get;} // 역직렬화 불가능 [JsonConstructor] public Forecast(DateTime date, int temperature, string summary){ (Date,Temperature,Summary) = (date,temperature,summary) } }
제약조건
- 변수 이름이 Json 변수 이름과 동일해야함.
[JsonPropertyName("name")]
- 변수 이름이 Json 변수 이름과 동일해야함.
생성자 매개변수 이름과 json 변수이름의 불일치를 해소할 수 있도록 함
public class Forecase { public DateTime Date{get;} // 역직렬화 불가능 [JsonPropertyName("celsius")] public int Temperature{get;} // pubilc string? Summary{get;} // 역직렬화 불가능 [JsonConstructor] public Forecast(DateTime date, int temperature, string summary){ (Date,Temperature,Summary) = (date,temperature,summary) } } json { "date" : "2024-09-24", "celsius" : -1, // Temperature와 불일치 "summary" : "Cold" }
'Language > C#' 카테고리의 다른 글
[C#] Reflection - MemberInfo/FieldInfo / PropertyInfo (0) | 2024.10.30 |
---|---|
[C#] Const와 Readonly (0) | 2024.10.14 |
[C#] String Builder (0) | 2024.10.14 |
[C#] 클래스 상속, 추상클래스, 인터페이스 (0) | 2024.10.14 |
[C#] Delegate, Event, Action 그리고 Func (0) | 2024.10.14 |