CodeGym /Các khóa học /C# SELF /Tổng quan về các lớp chuẩn để serialization trong .NET

Tổng quan về các lớp chuẩn để serialization trong .NET

C# SELF
Mức độ, Bài học
Có sẵn

1. Giới thiệu

Vì ta quyết định "tháo nhân vật LEGO ra thành từng mảnh", hãy cùng xem có những công cụ nào trong .NET để làm việc đó. Nói cách khác — những lớp chuẩn nào giúp serialize và deserialize object sang các định dạng khác nhau và điều gì đứng sau từng cái.

Cấu trúc gia đình serialization trong .NET

Tại thời điểm hiện tại (2025) .NET cung cấp vài cách tiếp cận chính cho serialization, mỗi cách có bộ lớp và công cụ riêng. Những cách chính và hay gặp nhất:

  • JSON-serialization — lựa chọn chính và hiện đại nhất, dùng trong đa số project.
  • XML-serialization — hơi cổ hơn một chút, nhưng vẫn được dùng rộng rãi.
  • Binary serialization — chỉ cho những trường hợp đặc biệt và thường qua giải pháp bên thứ ba hiện đại.

Nhiều ví dụ và phần lớn code trong .NET 9 dùng chính JSON, và đó không phải xu hướng nhất thời — đó là tiêu chuẩn công nghiệp. Nhưng .NET vẫn hỗ trợ các cách khác — phòng khi cần.

Nhân vật chính của serialization .NET

Định dạng Lớp serialization Độ đơn giản Hiệu năng Bảo mật Tính thời sự
JSON
System.Text.Json
🔥🔥🔥 🔥🔥🔥 🔥🔥🔥 Phổ biến nhất
XML
System.Xml.Serialization.XmlSerializer
🔥🔥 🔥🔥 🔥🔥 Vẫn được dùng
JSON Newtonsoft.Json (Json.NET) 🔥🔥🔥 🔥🔥 🔥🔥🔥 Rất phổ biến

Tóm tắt về từng cái

  • System.Text.Json: Tiêu chuẩn mới cho JSON serialization trong .NET, xuất hiện từ .NET Core 3.0, trở thành chính trong .NET 5+. Nhanh, nhẹ, an toàn, được tích hợp sẵn "out of the box" trong .NET 9. Tài liệu
  • XmlSerializer: Phương án cũ nhưng đã được kiểm chứng cho serialize sang XML. Dễ dùng, nhưng có giới hạn (ví dụ cần class public và thuộc tính public). Tốt cho tương thích và contract dữ liệu chặt chẽ. Tài liệu
  • Newtonsoft.Json: Trong thời gian dài là tiêu chuẩn de-facto cho JSON trước khi có System.Text.Json. Thường dùng cho các scenario phức tạp (dynamic, thuộc tính private, v.v.). Tài liệu

BinaryFormatter đi đâu rồi?

Nếu bạn gặp lời khuyên trên internet dùng BinaryFormatter — rất có thể đó là tutorial cổ. Đừng dùng BinaryFormatter: nó đã bị loại khỏi .NET 9 vì lý do bảo mật. Serialization nhị phân hiện đại do các giải pháp bên thứ ba đảm nhiệm — ví dụ Protobuf hoặc MessagePack.

2. Ví dụ đơn giản

Hãy thử áp dụng serialization và deserialization trên ví dụ class Player đã quen thuộc trong vũ trụ game của chúng ta.

Chuẩn bị class để serialize

// Player.cs
public class Player
{
    public string Name { get; set; }
    public int Health { get; set; }
    public bool IsAlive { get; set; }
    public List<string> Inventory { get; set; }
    public Position Position { get; set; }
}

public class Position
{
    public int X { get; set; }
    public int Y { get; set; }
}

a) Serialize và deserialize sang JSON bằng System.Text.Json

using System.Text.Json;

Player aragorn = new Player
{
    Name = "Aragorn",
    Health = 100,
    IsAlive = true,
    Inventory = new List<string> { "sword", "bow", "healing potion" },
    Position = new Position { X = 10, Y = 25 }
};

// Serialize object Player thành chuỗi JSON
string json = JsonSerializer.Serialize(aragorn);
// In JSON ra màn hình
Console.WriteLine(json);

// Deserialize chuỗi JSON trở lại object Player
Player? aragornClone = JsonSerializer.Deserialize<Player>(json);
// Kiểm tra xem clone có hoạt động không :)
Console.WriteLine(aragornClone?.Name); // Phải in ra "Aragorn"

Đơn giản vậy thôi — không cần "nhảy múa với bộc" hay attribute ma thuật. Bây giờ — thấy nó trông như thế nào ở XML.

b) Serialize và deserialize sang XML bằng XmlSerializer

using System.Xml.Serialization;

// Tạo serializer cho class Player
XmlSerializer serializer = new XmlSerializer(typeof(Player));

// Serialize ra file
using FileStream fs = new FileStream("aragorn.xml", FileMode.Create);
serializer.Serialize(fs, aragorn); // Lưu Aragorn vào file XML

// Deserialize từ file
using FileStream fs = new FileStream("aragorn.xml", FileMode.Open);
Player aragornFromXml = (Player) serializer.Deserialize(fs)!;
Console.WriteLine(aragornFromXml.Name); // Phải in ra "Aragorn"

Lưu ý! XmlSerializer yêu cầu class và các thuộc tính phải là public và có constructor mặc định (nếu bạn override constructor — làm cho nó public và không có tham số). Nếu không, serialization sẽ lỗi.

c) Serialize và deserialize sang JSON bằng Newtonsoft.Json

using Newtonsoft.Json; // Đừng quên thêm package Newtonsoft.Json qua NuGet!

// Serialize
string json2 = JsonConvert.SerializeObject(aragorn);

// Deserialize
Player? aragornFromNewtonsoft = JsonConvert.DeserializeObject<Player>(json2);

Console.WriteLine(aragornFromNewtonsoft?.Name); // Lại là "Aragorn"

Trông gần như giống hệt, nhưng Newtonsoft.Json có rất nhiều tuỳ chọn bổ sung — ví dụ có thể serialize các field private, tùy chỉnh format và xử lý các scenario phi tiêu chuẩn.

4. Những điểm hữu ích cần biết

Serializer chuẩn và khả năng của chúng

Lớp Định dạng Được tích hợp trong .NET Cần package NuGet? Phù hợp cho file Phù hợp cho API Độ đơn giản
System.Text.Json
JSON Có Không Có Có Nhẹ
Newtonsoft.Json
JSON Không Có Có Có Nhẹ
XmlSerializer
XML Có Không Có Thường Nhẹ

Làm sao biết nên dùng lớp nào?

Nếu bạn không chắc cần XML để làm gì — gần như luôn chọn JSON và System.Text.Json. Nhanh hơn, đơn giản hơn và phù hợp với thực tiễn hiện đại.

XML nên chọn khi:

  • Bạn tích hợp với hệ thống cũ yêu cầu đúng XML.
  • Cần schema chặt chẽ và validate cấu trúc dữ liệu.
  • Cấu trúc lớn, ổn định và cần tương thích chính thức (cấu hình, settings, trao đổi với hệ thống enterprise).

JSON — khi:

  • Bạn tạo ứng dụng hiện đại, tương tác với web và thiết bị di động.
  • Cần đơn giản, dễ đọc và gọn nhẹ.
  • Không muốn kéo thêm dependency thừa.

Newtonsoft.Json — khi:

  • Cần serialize các field private, tuỳ chỉnh đặc biệt, linh hoạt tối đa.
  • Hoặc project đã kế thừa thư viện này và việc migrate không hợp lý ngay bây giờ.

5. Lỗi điển hình và bẫy

Encoding. Các serializer chuẩn (đặc biệt khi làm việc với file) thường dùng UTF-8. Nếu thấy "kí tự lạ", kiểm tra cách bạn đọc/ghi file và thiết lập encoding rõ ràng. Tài liệu về cấu hình encoding.

Kiểu không được hỗ trợ. Một vài serializer chuẩn (nhất là XML) không serialize được ví dụ như dictionary (Dictionary), field private/protected, sự kiện, delegate và interface. Thông thường hỗ trợ các thuộc tính public đơn giản và class.

Phiên bản của class. Nếu bạn thay đổi cấu trúc class (thêm/đổi tên/xóa thuộc tính), dữ liệu đã lưu cũ có thể không đọc được hoặc deserialize sai. Lên kế hoạch versioning cho format.

Giá trị null. Khi deserialize, nếu trong dữ liệu không có trường nào đó thì thuộc tính tương ứng sẽ nhận giá trị mặc định (với kiểu tham chiếu — null). Đừng quên kiểm tra.

Attributes. Để tinh chỉnh chính xác thường dùng attributes như [JsonIgnore], [XmlElement] v.v. Chúng cho phép loại trừ thuộc tính, đổi tên element và điều khiển format — chi tiết sẽ có trong các bài sau.

2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Lưu và tải đối tượng trong XML
Lưu và tải đối tượng trong XML
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION