안녕하세요~
오늘은 C# 직렬화, 역직렬화에 대해 공부해요!
저번시간에 공부했던
BinaryWriter, BinaryReader / StreamWriter, StreamReader
기억나시나요?
가물가물하시다면 아래 게시물이 도움될거에요!
https://unityking.tistory.com/36
[C#] 파일 다루기
안녕하세요~오늘은 C# 파일 다루기에 대해 공부해요! 파일 : 컴퓨터 저장 매체에 기록되는 데이터의 묶음디렉터리 : 파일이 위치하는 주소 .NET에서 파일과 디렉터리를 다루기 위해 제공하는 클
unityking.tistory.com
BinaryWriter, BinaryReader / StreamWriter, StreamReader 클래스는
기본 데이터 형식을 스트림에
쓰고 읽을 수 있는 메소드를 제공하지만
프로그래머가 직접 정의한 클래스나 구조체 같은
복합 데이터 형식은 지원하지 않아요.
C#은 복합 데이터 형식을 스트림에
쉽게 읽고 쓸 수 있게 하는
직렬화(Serialization)을 제공해요.
직렬화란 객체의 상태(필드값)를
메모리나 영구 저장 장치에 저장이 가능한
0과 1의 순서로 바꾸는 것을 말해요
직렬화할 프로퍼티를 클래스에서
public으로 한정하면 끝이에요!
아래처럼 NameCard의 프로퍼티를 public으로 한정하고
JsonSerializer를 통해 저장할 수 있어요!
JsonSerializer는 System.Text.Json 네임스페이스 소속이고
객체를 Json형식으로 직렬화 또는 역직렬화해줘요.
class NameCard
{
public string Name { get; set; }
public string Phone { get; set; }
public int Age { get; set; }
}
class MainApp
{
static void Main(string[] args)
{
var fileName = "a.json";
using (Stream ws = new FileStream(fileName, FileMode.Create))
{
NameCard nc = new NameCard()
{
Name = "박상현",
Phone = "010-123-4567",
Age = 33
};
string jsonString = JsonSerializer.Serialize<NameCard>(nc);
byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
ws.Write(jsonBytes, 0, jsonBytes.Length);
}
using (Stream rs = new FileStream(fileName, FileMode.Open))
{
byte[] jsonBytes = new byte[rs.Length];
rs.Read(jsonBytes, 0, jsonBytes.Length);
string jsonString = System.Text.Encoding.UTF8.GetString(jsonBytes);
NameCard nc2 = JsonSerializer.Deserialize<NameCard>(jsonString);
Console.WriteLine($"Name: {nc2.Name}");
Console.WriteLine($"Phone: {nc2.Phone}");
Console.WriteLine($"Age: {nc2.Age}");
}
}
}
직렬화 하고 싶지 않은 프로퍼티에 대해서는
아래처럼
[JsonIgnore] 애트리뷰트로 수식해주면 된답니다.
class NameCard
{
public string Name { get; set; }
public string Phone { get; set; }
[JsonIgnore]
public int Age { get; set; }
}
List와 같은 컬렉션들도 직렬화를 지원해요
바로 예제 코드 추가할게요.
class NameCard
{
public string Name { get; set; }
public string Phone { get; set; }
public int Age { get; set; }
}
class MainApp
{
static void Main(string[] args)
{
var fileName = "a.json";
using (Stream ws = new FileStream(fileName, FileMode.Create))
{
var list = new List<NameCard>();
list.Add(new NameCard() { Name = "박상현", Phone = "010-123-4567", Age = 22 });
list.Add(new NameCard() { Name = "김연아", Phone = "010-323-1111", Age = 22 });
list.Add(new NameCard() { Name = "장미란", Phone = "010-555-5555", Age = 22 });
string jsonString = JsonSerializer.Serialize<List<NameCard>>(list);
byte[] jsonBytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
ws.Write(jsonBytes, 0, jsonBytes.Length);
}
using (Stream rs = new FileStream(fileName, FileMode.Open))
{
byte[] jsonBytes = new byte[rs.Length];
rs.Read(jsonBytes, 0, jsonBytes.Length);
string jsonString = System.Text.Encoding.UTF8.GetString(jsonBytes);
var list2 = JsonSerializer.Deserialize<List<NameCard>>(jsonString);
foreach (NameCard nc in list2)
{
Console.WriteLine($"Name : {nc.Name} Phone : {nc.Phone} Age : {nc.Age}");
}
}
}
}'C#' 카테고리의 다른 글
| [C#] Thread (1) | 2024.10.18 |
|---|---|
| [C#] 파일 다루기 (0) | 2024.10.16 |
| [C#] Dynamic 형식 (2) | 2024.10.15 |
| [C#] 리플렉션과 애트리뷰트 (1) | 2024.10.14 |
| [C#] LINQ (1) | 2024.10.13 |