JavaScriptSerializer و enum إلى سلسلة نصية: أهم الأخطاء وكيفية تجنبها

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

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

ابدأ الدورة

لماذا يعتبر تسلسل enum بمثابة صداع لكل مطور C#

\n\n

هل سبق لك أن واجهت موقفًا حيث بدأ كود C# الأنيق الخاص بك، الذي يعمل مع التعدادات (enum)، فجأة في إخراج أرقام غريبة بدلاً من الأسماء الواضحة؟ إذا كان الأمر كذلك، فأنت لست وحدك. سؤال "JavaScriptSerializer - JSON serialization of enum as string" على Stack Overflow حصد آلاف المشاهدات، وهذا يعني أن المشكلة مألوفة للكثيرين.

\n\n

دعنا نفهم لماذا يقوم JavaScriptSerializer افتراضيًا بتحويل أسماء enum الجميلة إلى أرقام بلا معنى، والأهم من ذلك، كيفية إصلاح هذا بشكل نهائي.

\n\n

المشكلة: لماذا يتحول enum إلى رقم؟

\n\n

افتراضيًا، يقوم JavaScriptSerializer (فئة من مساحة الأسماء System.Web.Script.Serialization) بتسلسل التعدادات كقيمها الصحيحة. هذا يرجع إلى أن كل enum يعتمد على عدد صحيح (int افتراضيًا).

\n\n
public enum Status\n{\n    Active = 1,\n    Inactive = 2,\n    Pending = 3\n}\n\npublic class Order\n{\n    public int Id { get; set; }\n    public Status OrderStatus { get; set; }\n}\n\n// التسلسل\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// النتيجة: {"Id":1,"OrderStatus":1}\n
\n\n

توافق معي، "OrderStatus":1 يبدو غير مفيد. تخيل أن JSON كهذا يُرسل إلى API - سيتعين على كود العميل التخمين حول معنى الرقم 1.

\n\n

أهم 5 أخطاء عند العمل مع JavaScriptSerializer و enum

\n\n

الخطأ 1: استخدام EnumMemberAttribute دون إعدادات

\n\n

يحاول العديد من المطورين تطبيق [EnumMember] من مساحة System.Runtime.Serialization، معتقدين أن هذا سيحل المشكلة. لكن JavaScriptSerializer لا يعالج هذا السمة افتراضيًا.

\n\n
[DataContract]\npublic enum Status\n{\n    [EnumMember(Value = "active")]\n    Active = 1,\n    [EnumMember(Value = "inactive")]\n    Inactive = 2\n}\n\n// JavaScriptSerializer سيظل ينتج أرقامًا\n
\n\n

الخطأ 2: تجاهل ScriptIgnoreAttribute

\n\n

يحاول البعض إخفاء خاصية enum، ثم إضافة تمثيل نصي بشكل منفصل. هذا يعقد الكود ويخل بسلامة البيانات.

\n\n

الخطأ 3: التحويل اليدوي عبر if/switch

\n\n

أكثر "حل مؤقت" شيوعًا هو إنشاء خاصية نصية إضافية وتحويل يدوي:

\n\n
public class Order\n{\n    public int Id { get; set; }\n    public Status OrderStatus { get; set; }\n    \n    // تكرار البيانات - ممارسة سيئة\n    public string OrderStatusString\n    {\n        get { return OrderStatus.ToString(); }\n    }\n}\n
\n\n

المشكلة: لديك الآن خاصيتان تحتاجان إلى المزامنة. عاجلاً أم آجلاً سيفترقان.

\n\n

الخطأ 4: نسيان حالة الأحرف

\n\n

حتى إذا تغلبت على التسلسل، قد يتوقع كود العميل "active"، بينما يحصل على "Active". الفرق في حالة الأحرف يؤدي إلى أخطاء في جانب JavaScript.

\n\n

الخطأ 5: استخدام JavaScriptSerializer القديم بدلاً من Newtonsoft.Json

\n\n

تُعتبر فئة JavaScriptSerializer قديمة في الإصدارات الحديثة من .NET. توصي Microsoft باستخدام System.Text.Json أو Newtonsoft.Json. لكن إذا كنت تعمل مع مشروع قديم أو Web Forms، فلن تتمكن من تجنبه.

\n\n

كيفية تسلسل enum إلى سلسلة نصية بشكل صحيح: 3 حلول عملية

\n\n

الحل 1: محول مخصص (الطريقة الموصى بها)

\n\n

أنشئ فئة خاصة بك ترث من JavaScriptConverter، وسجلها في المسلسل.

\n\n
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n    public override IEnumerable<Type> SupportedTypes\n                

المدونات

توصيات الكتب