Por que a serialização de enum é uma dor de cabeça para todo desenvolvedor C#
\n\nVocê já se deparou com uma situação em que seu código C# organizado, trabalhando com enumerações (enum), de repente começa a exibir números estranhos em vez de nomes compreensíveis? Se sim, você não está sozinho. A pergunta "JavaScriptSerializer - JSON serialization of enum as string" no Stack Overflow acumulou milhares de visualizações, o que significa que o problema é familiar para muitos.
\n\nVamos entender por que o JavaScriptSerializer por padrão transforma seus belos nomes de enum em números sem identidade e, principalmente, como corrigir isso de uma vez por todas.
\n\nO problema: por que o enum se transforma em número?
\n\nPor padrão, o JavaScriptSerializer (classe do namespace System.Web.Script.Serialization) serializa enumerações como seus valores inteiros. Isso ocorre porque cada enum é baseado em um número inteiro (int por padrão).
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// Serialização\nvar order = new Order { Id = 1, OrderStatus = Status.Active };\nvar serializer = new JavaScriptSerializer();\nstring json = serializer.Serialize(order);\n// Resultado: {"Id":1,"OrderStatus":1}\n\n\nConcorde, "OrderStatus":1 parece pouco informativo. Imagine que esse JSON seja enviado para uma API — o código cliente terá que adivinhar o que o número 1 significa.
Top 5 erros ao trabalhar com JavaScriptSerializer e enum
\n\nErro 1: Uso de EnumMemberAttribute sem configuração
\n\nMuitos desenvolvedores tentam usar [EnumMember] do namespace System.Runtime.Serialization, pensando que isso resolverá o problema. Mas o JavaScriptSerializer não processa esse atributo por padrão.
[DataContract]\npublic enum Status\n{\n [EnumMember(Value = "active")]\n Active = 1,\n [EnumMember(Value = "inactive")]\n Inactive = 2\n}\n\n// JavaScriptSerializer ainda exibirá números\n\n\nErro 2: Ignorar o ScriptIgnoreAttribute
\n\nAlguns tentam ocultar a propriedade enum e depois adicionar uma representação em string separadamente. Isso complica o código e quebra a integridade dos dados.
\n\nErro 3: Conversão manual com if/switch
\n\nA "gambiarra" mais comum é criar uma propriedade string adicional e fazer a conversão manual:
\n\npublic class Order\n{\n public int Id { get; set; }\n public Status OrderStatus { get; set; }\n \n // Duplicação de dados — má prática\n public string OrderStatusString\n {\n get { return OrderStatus.ToString(); }\n }\n}\n\n\nProblema: agora você tem duas propriedades que precisam ser sincronizadas. Mais cedo ou mais tarde, elas divergirão.
\n\nErro 4: Esquecer a diferença de maiúsculas/minúsculas
\n\nMesmo que você resolva a serialização, o código cliente pode esperar "active", mas receber "Active". A diferença de maiúsculas/minúsculas causa bugs no lado do JavaScript.
Erro 5: Usar o obsoleto JavaScriptSerializer em vez de Newtonsoft.Json
\n\nA classe JavaScriptSerializer é considerada obsoleta nas versões modernas do .NET. A Microsoft recomenda usar System.Text.Json ou Newtonsoft.Json. Mas se você trabalha com um projeto legado ou Web Forms, não conseguirá evitá-lo.
Como serializar corretamente enum para string: 3 soluções funcionais
\n\nSolução 1: Conversor personalizado (método recomendado)
\n\nCrie sua própria classe herdando de JavaScriptConverter e registre-a no serializador.
public class EnumToStringConverter<T> : JavaScriptConverter where T : struct\n{\n public override IEnumerable<Type> SupportedTypes\n