Pourquoi la sérialisation des enum est un casse-tête pour chaque développeur C#
\n\nAvez-vous déjà été confronté à une situation où votre code C# soigné, qui utilise des énumérations (enum), commence soudainement à produire des chiffres étranges au lieu de noms compréhensibles ? Si oui, vous n'êtes pas seul. La question "JavaScriptSerializer - JSON serialization of enum as string" sur Stack Overflow a recueilli des milliers de vues, ce qui signifie que le problème est familier à beaucoup.
\n\nVoyons pourquoi JavaScriptSerializer transforme par défaut vos jolis noms d'enum en nombres anonymes, et surtout comment y remédier une fois pour toutes.
\n\nLe problème : pourquoi l'enum se transforme-t-il en nombre ?
\n\nPar défaut, JavaScriptSerializer (classe de l'espace de noms System.Web.Script.Serialization) sérialise les énumérations sous forme de leurs valeurs entières. Cela est dû au fait que chaque enum est basé sur un nombre entier (int par défaut).
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// Sérialisation\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// Résultat : {"Id":1,"OrderStatus":1}\n\n\nVous en conviendrez, "OrderStatus":1 n'est pas très informatif. Imaginez que ce JSON soit envoyé à une API — le code client devra deviner ce que signifie le chiffre 1.
Top 5 des erreurs avec JavaScriptSerializer et les enum
\n\nErreur 1 : Utilisation de EnumMemberAttribute sans configuration
\n\nDe nombreux développeurs tentent d'appliquer [EnumMember] de l'espace System.Runtime.Serialization, pensant que cela résoudra le problème. Mais JavaScriptSerializer ne traite pas cet attribut par défaut.
[DataContract]\npublic enum Status\n{\n [EnumMember(Value = "active")]\n Active = 1,\n [EnumMember(Value = "inactive")]\n Inactive = 2\n}\n\n// JavaScriptSerializer donnera toujours des nombres\n\n\nErreur 2 : Ignorer ScriptIgnoreAttribute
\n\nCertains essaient de masquer la propriété enum, puis d'ajouter une représentation sous forme de chaîne séparément. Cela complique le code et compromet l'intégrité des données.
\n\nErreur 3 : Conversion manuelle via if/switch
\n\nLa "béquille" la plus courante consiste à créer une propriété chaîne supplémentaire et à effectuer une conversion manuelle :
\n\npublic class Order\n{\n public int Id { get; set; }\n public Status OrderStatus { get; set; }\n \n // Duplication de données — mauvaise pratique\n public string OrderStatusString\n {\n get { return OrderStatus.ToString(); }\n }\n}\n\n\nProblème : vous avez maintenant deux propriétés qui doivent être synchronisées. Tôt ou tard, elles divergeront.
\n\nErreur 4 : Oublier la casse des caractères
\n\nMême si vous maîtrisez la sérialisation, le code client peut s'attendre à "active" et recevoir "Active". La différence de casse entraîne des bugs côté JavaScript.
Erreur 5 : Utilisation de JavaScriptSerializer obsolète au lieu de Newtonsoft.Json
\n\nLa classe JavaScriptSerializer est considérée comme obsolète dans les versions modernes de .NET. Microsoft recommande d'utiliser System.Text.Json ou Newtonsoft.Json. Mais si vous travaillez sur un projet hérité ou avec Web Forms, vous ne pouvez pas l'éviter.
Comment sérialiser correctement un enum en chaîne : 3 solutions fonctionnelles
\n\nSolution 1 : Convertisseur personnalisé (méthode recommandée)
\n\nCréez votre propre classe héritant de JavaScriptConverter et enregistrez-la dans le sérialiseur.
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n public override IEnumerable<Type> SupportedTypes\n