تسلسل الكائنات في C# (.NET): من الأساسيات إلى التقنيات المتقدمة
التسلسل هو عملية تحويل الكائنات المعقدة (الفئات، الهياكل) إلى تنسيق يمكن حفظه في ملف، أو إرساله عبر الشبكة، أو كتابته في قاعدة بيانات. العملية العكسية (استعادة الكائن من تدفق البيانات) تسمى إلغاء التسلسل. في منصة .NET، توجد عدة أدوات مدمجة وأدوات خارجية للتسلسل، لكل منها خصائصه وأداؤه ومجال تطبيقه.
في هذه المقالة، سنستعرض الطرق الرئيسية للتسلسل في C#: JSON (System.Text.Json و Newtonsoft.Json)، XML (XmlSerializer)، التسلسل الثنائي (BinaryFormatter - قديم ولكنه لا يزال موجودًا) و Protocol Buffers (protobuf-net) للسيناريوهات عالية الأداء.
1. التسلسل إلى JSON باستخدام System.Text.Json
بدءًا من .NET Core 3.0، توصي Microsoft باستخدام مساحة الأسماء System.Text.Json للعمل مع JSON. وهي واجهة برمجة تطبيقات سريعة ومنخفضة المستوى وغير متزامنة.
مثال على التسلسل وإلغاء التسلسل:
using System;using System.Text.Json;
public class Person{ public string Name { get; set; } public int Age { get; set; } public string Email { get; set; }}
class Program{ static void Main() { var person = new Person { Name = "إيفان بيتروف", Age = 30, Email = "ivan@example.com" };
// التسلسل إلى سلسلة JSON string jsonString = JsonSerializer.Serialize(person); Console.WriteLine(jsonString); // الإخراج: {"Name":"إيفان بيتروف","Age":30,"Email":"ivan@example.com"}
// إلغاء التسلسل من JSON string jsonInput = @"{""Name"":""ماريا"",""Age"":25,""Email"":""maria@test.ru""}"; Person restoredPerson = JsonSerializer.Deserialize<Person>(jsonInput); Console.WriteLine($"الاسم: {restoredPerson.Name}, العمر: {restoredPerson.Age}"); }}إعدادات التسلسل:
- تجاهل الخصائص الفارغة (null):
JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull } - التنسيق (طباعة جميلة):
JsonSerializerOptions { WriteIndented = true } - التعامل مع المراجع الدائرية:
ReferenceHandler.Preserve
2. Newtonsoft.Json (Json.NET) — الكلاسيكي
قبل ظهور System.Text.Json، كانت المكتبة Newtonsoft.Json (تُثبّت عبر NuGet) هي المعيار الفعلي. وهي تدعم سيناريوهات أكثر: الكائنات الديناميكية، السمات، المحولات والإعدادات المرنة.
using Newtonsoft.Json;
public class Order{ public int Id { get; set; } public decimal Amount { get; set; } [JsonIgnore] public string InternalNote { get; set; } // لن يتم تسلسل هذا الحقل}
var order = new Order { Id = 1, Amount = 99.99m, InternalNote = "سري" };string json = JsonConvert.SerializeObject(order, Formatting.Indented);Console.WriteLine(json);// {// "Id": 1,// "Amount": 99.99// }
var deserialized = JsonConvert.DeserializeObject<Order>(json);3. التسلسل إلى XML (XmlSerializer)
لتنسيق XML في .NET، تُستخدم الفئة XmlSerializer. وهي مناسبة تمامًا للتوافق مع الأنظمة القديمة وخدمات SOAP.
using System;using System.IO;using System.Xml.Serialization;
[Serializable]public class Product{ [XmlAttribute] public int Id { get; set; } [XmlElement("ProductName")] public string Name { get; set; }}
class Program{ static void Main() { var product = new Product { Id = 42, Name = "لابتوب" };
// التسلسل