مقدمة: لماذا يجب على كل مطور C# أن يعرف كيفية تسلسل الكائنات إلى JSON
\n\nهل تساءلت يومًا عن عدد المرات التي يحول فيها كودك كائنات C# المعقدة إلى سلاسل JSON مضغوطة؟ العمل مع واجهات برمجة التطبيقات (API)، حفظ التهيئات، نقل البيانات بين الخدمات المصغرة — في كل مكان نواجه التسلسل. سؤال "How do I turn a C# object into a JSON string in .NET?" هو أحد أكثر الأسئلة شيوعًا على Stack Overflow، وهذا ليس من قبيل الصدفة. يعتمد كيفية قيامك بذلك على سرعة تطبيقك واستجابته.
\n\nفي هذه المقالة، لن نعرض فقط كيفية تحويل كائن إلى سلسلة JSON. سنقوم بتحليل التحسين والأداء لهذه العملية: من اختيار المكتبة إلى الضبط الدقيق للمسلسل. ستتعلم كيفية تجنب الأخطاء النموذجية التي تبطئ تطبيقك، وستتعلم كتابة كود يعمل بسرعة البرق.
\n\nالطريقة الأساسية: كيفية تحويل كائن C# إلى سلسلة JSON
\n\nلنبدأ بالكلاسيكيات. لنفترض أن لدينا فئة بسيطة User:
public class User\n{\n public int Id { get; set; }\n public string Name { get; set; }\n public string Email { get; set; }\n}\n\nأسهل طريقة لتسلسلها هي استخدام Newtonsoft.Json (المعروف أيضًا باسم Json.NET):
\n\nusing Newtonsoft.Json;\n\nvar user = new User { Id = 1, Name = "أليكسي", Email = "alex@example.com" };\nstring json = JsonConvert.SerializeObject(user);\nConsole.WriteLine(json); \n// {"Id":1,"Name":"أليكسي","Email":"alex@example.com"}\n\nمع إصدار .NET Core 3.0، ظهر System.Text.Json الأصلي — بديل سريع وخفيف الوزن:
\n\nusing System.Text.Json;\n\nvar user = new User { Id = 1, Name = "أليكسي", Email = "alex@example.com" };\nstring json = JsonSerializer.Serialize(user);\nConsole.WriteLine(json);\n// {"Id":1,"Name":"أليكسي","Email":"alex@example.com"}\n\nيبدو أنه لا يوجد فرق. ولكن عندما يعالج تطبيقك آلاف الطلبات في الثانية، يصبح اختيار المسلسل أمرًا بالغ الأهمية.
\n\nالأداء: Newtonsoft.Json مقابل System.Text.Json
\n\nدعونا نلقي نظرة على أداء التسلسل في .NET 8. في اختبارات مع مليون عملية:
\n\n- \n
- System.Text.Json — أسرع بنسبة 40-60% في المتوسط من Newtonsoft.Json عند تسلسل الكائنات البسيطة. \n
- Newtonsoft.Json — يخسر في السرعة، لكنه يفوز في المرونة: يدعم المزيد من المحولات المخصصة والسمات. \n
- استهلاك الذاكرة — يولد System.Text.Json قمامة أقل، مما يقلل الحمل على جامع القمامة (GC). \n
ومع ذلك، هناك فارق بسيط: إذا كنت بحاجة إلى دعم JsonIgnore أو JsonPropertyName أو المحولات المعقدة، فإن Newtonsoft.Json لا يزال لا غنى عنه. ولكن بالنسبة لمعظم المشاريع الحديثة على .NET 6+ يوصى باستخدام System.Text.Json.
تحسين التسلسل: 5 نصائح عملية
\n\nالآن ننتقل إلى الجزء الأكثر إثارة للاهتمام — كيفية جعل كودك أسرع.
\n\n1. استخدم مولدات المصدر (source generators)
\n\nيدعم System.Text.Json توليد المصدر — وهو تجميع كود التسلسل في مرحلة البناء، وليس أثناء التنفيذ. النتيجة: تسريع بمقدار 2-3 مرات!
\n\n[JsonSerializable(typeof(User))]\npublic partial class UserContext : JsonSerializerContext\n{\n}\n\n// الاستخدام:\nstring json = JsonSerializer.Serialize(user, UserContext.Default.User);\n\nهذا النهج فعال بشكل خاص للنماذج الكبيرة والتطبيقات ذات الأحمال العالية.
\n\n2. قم بضبط المسلسل وفقًا لمهامك
\n\nلا تستخدم الإعدادات الافتراضية. قم بتعطيل الخيارات غير الضرورية:
\n\nvar options = new JsonSerializerOptions\n{\n PropertyNamingPolicy = JsonNami