enum को serialize करना: हर C# डेवलपर की परेशानी
\n\nक्या आपने कभी ऐसी स्थिति का सामना किया है जब आपका साफ-सुथरा C# कोड, जो enum के साथ काम कर रहा था, अचानक समझने योग्य नामों की जगह अजीब संख्याएँ दिखाने लगे? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "JavaScriptSerializer - JSON serialization of enum as string" सवाल के हज़ारों व्यूज़ हैं, जो बताता है कि यह समस्या कई लोगों को परेशान करती है।
\n\nआइए समझते हैं कि JavaScriptSerializer डिफ़ॉल्ट रूप से आपके खूबसूरत enum नामों को बेजान संख्याओं में क्यों बदल देता है, और सबसे महत्वपूर्ण बात - इसे हमेशा के लिए कैसे ठीक करें।
\n\nसमस्या: enum संख्या में क्यों बदल जाता है?
\n\nडिफ़ॉल्ट रूप से, JavaScriptSerializer (जो System.Web.Script.Serialization नेमस्पेस का क्लास है) enum को उनके पूर्णांक मानों के रूप में serialize करता है। ऐसा इसलिए है क्योंकि हर enum के पीछे एक पूर्णांक (int) होता है।
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// Serialization\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 का मतलब क्या है।
JavaScriptSerializer और enum के साथ शीर्ष 5 गलतियाँ
\n\nगलती 1: बिना कॉन्फ़िगरेशन के EnumMemberAttribute का उपयोग
\n\nकई डेवलपर System.Runtime.Serialization से [EnumMember] लगाते हैं, यह सोचकर कि इससे समस्या हल हो जाएगी। लेकिन JavaScriptSerializer डिफ़ॉल्ट रूप से इस एट्रीब्यूट को प्रोसेस नहीं करता।
[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\npublic 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भले ही आप serialization जीत लें, क्लाइंट कोड "active" की उम्मीद कर सकता है और उसे "Active" मिलेगा। केस का अंतर JavaScript की तरफ बग पैदा करता है।
गलती 5: Newtonsoft.Json की जगह पुराने JavaScriptSerializer का उपयोग
\n\nJavaScriptSerializer क्लास को आधुनिक .NET वर्ज़न में पुराना माना जाता है। Microsoft System.Text.Json या Newtonsoft.Json का उपयोग करने की सलाह देता है। लेकिन अगर आप लीगेसी प्रोजेक्ट या Web Forms के साथ काम कर रहे हैं, तो इससे बचना मुश्किल है।
enum को स्ट्रिंग में सही तरीके से serialize करें: 3 कारगर समाधान
\n\nसमाधान 1: कस्टम कन्वर्टर (अनुशंसित तरीका)
\n\nJavaScriptConverter से इनहेरिट करके अपना क्लास बनाएँ और इसे सीरियलाइज़र में रजिस्टर करें।
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n public override IEnumerable<Type> SupportedTypes\n