تسلسل الكائنات في C# (.NET): JSON وXML وBinary

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تسلسل الكائنات في C# (.NET): JSON وXML وBinary

\n

التسلسل هو عملية تحويل كائن معقد (أو رسم بياني للكائنات) إلى تدفق بايت أو تنسيق نصي (JSON، XML). هذا ضروري لحفظ حالة الكائن في ملف، نقل البيانات عبر الشبكة (REST API، gRPC) أو التخزين المؤقت. العملية العكسية - إلغاء التسلسل - تستعيد الكائن من التمثيل المسلسل. في نظام .NET البيئي (بما في ذلك .NET Core و .NET 5/6/7/8) توجد عدة آليات تسلسل مدمجة.

\n\n

1. System.Text.Json - التسلسل الحديث إلى JSON

\n

بدءًا من .NET Core 3.0، توصي Microsoft باستخدام System.Text.Json كطريقة رئيسية للعمل مع JSON. المكتبة خفيفة الوزن، عالية الأداء ولا تتطلب تبعيات خارجية (على عكس Newtonsoft.Json).

\n

مثال على التسلسل الأساسي وإلغاء التسلسل

\n
using System;\nusing System.Text.Json;\n\npublic class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n    public List<string> Hobbies { get; set; }\n}\n\nclass Program\n{\n    static void Main()\n    {\n        var person = new Person\n        {\n            Name = "أليكسي",\n            Age = 30,\n            Hobbies = new List<string> { "القراءة", "البرمجة" }\n        };\n\n        // التسلسل\n        string json = JsonSerializer.Serialize(person);\n        Console.WriteLine(json);\n        // {"Name":"أليكسي","Age":30,"Hobbies":["القراءة","البرمجة"]}\n\n        // إلغاء التسلسل\n        Person restored = JsonSerializer.Deserialize<Person>(json);\n        Console.WriteLine(restored.Name); // أليكسي\n    }\n}
\n\n

تخصيص التسلسل باستخدام السمات

\n

يمكنك التحكم في أسماء الخصائص في JSON، تجاهل القيم الفارغة أو استخدام محولات مخصصة:

\n
using System.Text.Json.Serialization;\n\npublic class Product\n{\n    [JsonPropertyName("product_id")]\n    public int Id { get; set; }\n\n    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]\n    public string? Description { get; set; }\n\n    [JsonConverter(typeof(JsonStringEnumConverter))]\n    public Status Status { get; set; }\n}\n\npublic enum Status { Active, Inactive }
\n\n

2. XmlSerializer - التسلسل إلى XML

\n

الفئة XmlSerializer (مساحة الأسماء System.Xml.Serialization) متاحة في جميع إصدارات .NET وهي مثالية للتوافق مع الأنظمة القديمة أو ملفات XML التكوينية.

\n

مثال على العمل مع XmlSerializer

\n
using System;\nusing System.IO;\nusing System.Xml.Serialization;\n\n[XmlRoot("Employee")]\npublic class Employee\n{\n    [XmlElement("FullName")]\n    public string Name { get; set; }\n\n    [XmlAttribute("id")]\n    public int Id { get; set; }\n\n    [XmlArray("Projects")]\n    [XmlArrayItem("Project")]\n    public List<string> Projects { get; set; }\n}\n\nclass Program\n{\n    static void Main()\n    {\n        var emp = new Employee\n        {\n            Id = 101,\n            Name = "ماريا إيفانوفا",\n            Projects = new List<string> { "Alpha", "Beta" }\n        };\n\n        var serializer = new XmlSerializer(typeof(Employee));\n        using (var writer = new StreamWriter("employee.xml"))\n        {\n            serializer.Serialize(writer, emp);\n        }\n\n        // إلغاء التسلسل\n        using (var reader = new StreamReader("employee.xml"))\n        {\n            Employee restored = (Employee)serializer.Deserialize(reader);\n            Console.WriteLine(restored.Name); // ماريا إيفانوفا\n        }\n    }\n}
\n

هام: XmlSerializer يتطلب أن يكون للفئة مُنشئ عام بدون معاملات، وأن تكون الخصائص المراد تسلسلها عامة ولها أدوات ضبط (setters).

\n\n

3. BinaryFormatter (قديم، ولكن يُذكر للإرث)

\n

سابقًا، كان System.Runtime.Serialization.Formatters.Binary.Bi

توصيات