Warum die Enum-Serialisierung jedem C#-Entwickler Kopfschmerzen bereitet
\n\nHaben Sie schon einmal die Situation erlebt, dass Ihr sauberer C#-Code, der mit Aufzählungen (Enum) arbeitet, plötzlich seltsame Zahlen anstelle verständlicher Namen ausgibt? Wenn ja – Sie sind nicht allein. Die Frage "JavaScriptSerializer - JSON serialization of enum as string" auf Stack Overflow hat tausende Aufrufe gesammelt, was bedeutet, dass das Problem vielen bekannt ist.
\n\nLassen Sie uns verstehen, warum JavaScriptSerializer standardmäßig Ihre schönen Enum-Namen in gesichtslose Zahlen verwandelt, und vor allem – wie Sie dies ein für alle Mal beheben können.
\n\nDas Problem: Warum wird Enum zu einer Zahl?
\n\nStandardmäßig serialisiert JavaScriptSerializer (Klasse aus dem Namespace System.Web.Script.Serialization) Aufzählungen als ihre ganzzahligen Werte. Dies liegt daran, dass jedem Enum eine ganze Zahl zugrunde liegt (standardmäßig 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// Serialisierung\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// Ergebnis: {"Id":1,"OrderStatus":1}\n\n\nGeben Sie zu, "OrderStatus":1 sieht nicht informativ aus. Stellen Sie sich vor, ein solches JSON geht an die API – der Client-Code wird rätseln, was die Zahl 1 bedeutet.
Top-5 Fehler bei der Arbeit mit JavaScriptSerializer und Enum
\n\nFehler 1: Verwendung von EnumMemberAttribute ohne Konfiguration
\n\nViele Entwickler versuchen, [EnumMember] aus dem Namespace System.Runtime.Serialization anzuwenden, in der Annahme, dass dies das Problem löst. Aber JavaScriptSerializer verarbeitet dieses Attribut standardmäßig nicht.
[DataContract]\npublic enum Status\n{\n [EnumMember(Value = "active")]\n Active = 1,\n [EnumMember(Value = "inactive")]\n Inactive = 2\n}\n\n// JavaScriptSerializer gibt trotzdem Zahlen aus\n\n\nFehler 2: Ignorieren von ScriptIgnoreAttribute
\n\nEinige versuchen, die Enum-Eigenschaft zu verstecken und dann separat eine Zeichenfolgendarstellung hinzuzufügen. Dies verkompliziert den Code und verletzt die Datenintegrität.
\n\nFehler 3: Manuelle Konvertierung über if/switch
\n\nDer häufigste "Workaround" – Erstellen einer zusätzlichen Zeichenfolgeneigenschaft und manuelle Konvertierung:
\n\npublic class Order\n{\n public int Id { get; set; }\n public Status OrderStatus { get; set; }\n \n // Datenverdopplung – schlechte Praxis\n public string OrderStatusString\n {\n get { return OrderStatus.ToString(); }\n }\n}\n\n\nProblem: Jetzt haben Sie zwei Eigenschaften, die synchronisiert werden müssen. Früher oder später werden sie auseinanderdriften.
\n\nFehler 4: Vergessen der Groß-/Kleinschreibung
\n\nSelbst wenn Sie die Serialisierung gemeistert haben, könnte der Client-Code "active" erwarten, aber "Active" erhalten. Unterschiede in der Groß-/Kleinschreibung führen zu Fehlern auf der JavaScript-Seite.
Fehler 5: Verwendung des veralteten JavaScriptSerializer anstelle von Newtonsoft.Json
\n\nDie Klasse JavaScriptSerializer gilt in modernen .NET-Versionen als veraltet. Microsoft empfiehlt die Verwendung von System.Text.Json oder Newtonsoft.Json. Aber wenn Sie mit einem Legacy-Projekt oder Web Forms arbeiten, können Sie ihn nicht vermeiden.
Wie man Enum korrekt in einen String serialisiert: 3 funktionierende Lösungen
\n\nLösung 1: Benutzerdefinierter Konverter (empfohlener Weg)
\n\nErstellen Sie Ihre eigene Klasse, die von JavaScriptConverter erbt, und registrieren Sie sie im Serialisierer.
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n public override IEnumerable<Type> SupportedTypes\n