Qual é a diferença entre DataContractJsonSerializer e JavaScriptSerializer?

88

O .NET Framework é fornecido com System.Runtime.Serialization.Json.DataContractJsonSerializer e System.Web.Script.Serialization.JavaScriptSerializer , ambos de / serializar JSON. Como posso saber quando escolher um desses tipos em vez do outro? O MSDN não deixa claro quais são suas vantagens relativas.

Temos vários projetos que consomem ou emitem JSON, e a classe selecionada para cada um até agora depende da opinião do desenvolvedor principal de cada projeto. Alguns são simples, dois têm lógica complexa em relação à produção de tipos gerenciados de JSON (os tipos não são mapeados de perto para os fluxos), mas não têm ênfase na velocidade, um exige velocidade. Nenhum interage com o WCF, pelo menos a partir de agora.

Embora esteja interessado em bibliotecas alternativas, espero que alguém também possa ter uma resposta para minha pergunta.

Justin R.
fonte
8
use Json.Net json.codeplex.com . Você terá muito mais controle sobre o processo de serialização / desserialização.
LB de
Depende de como você está usando. DataContractJsonSerializer tende a funcionar bem com WCF. JavaScriptSerializer é muito mais simples. O que você está tentando fazer?
jrummell de
Use ServiceStack.JsonSerializer - é o mais rápido. Mas não honra o atributo [ScriptIgnore]. Não é um problema se você não precisa. Veja uma longa discussão sobre isso aqui: stackoverflow.com/questions/9150920/…
Ofer Zelig
18
Por que todo mundo coloca suas respostas nos comentários? É difícil votar nas respostas ou comentar sobre elas.
Justin R.
3
@JustinR. talvez por causa de algum policial aqui que iria negar as respostas de uma linha e dizer: "isto deve ser um comentário".
nawfal

Respostas:

68

O DataContractJsonSerializer se destina ao uso com aplicativos cliente WCF em que os tipos serializados são geralmente classes POCO com o atributo DataContract aplicado a eles. Sem DataContract, sem serialização. O mecanismo de mapeamento do WCF torna o envio e recebimento muito simples, mas somente se sua plataforma for homogênea. Se você começar a misturar conjuntos de ferramentas diferentes, seu programa pode ir para o lado.

O JavaScriptSerializer pode serializar qualquer tipo, incluindo tipos anônimos (unidirecional), e faz isso de uma maneira mais compatível. Você perde a "automagic" do WCF, mas ganha mais opções de integração.

Como você pode ver pelos comentários, há muitas opções para serialização AJAX e, para resolver suas questões de velocidade versus capacidade de manutenção, pode valer a pena investigá-las para encontrar uma solução que atenda às necessidades de todas as equipes, para reduza os problemas de manutenção a longo prazo, pois cada um faz as coisas à sua maneira.

2014-04-07 UPDATE: Eu sugiro usar JSON.NET se você puder. Consulte http://james.newtonking.com/json Comparação de recursos para uma revisão das 3 bibliotecas consideradas nesta questão.

2015-05-26 UPDATE: Se sua empresa requer o uso de produtos comercialmente licenciáveis, ou você precisa de cada bit de desempenho, você também pode verificar https://servicestack.net/ .

Bahri Gungor
fonte
2
Quais são as diferenças de desempenho de serialização entre os dois? Digamos que eles serializarão o mesmo número de entidades com o mesmo número de atributos?
Adrian Salazar
20

Ambos fazem aproximadamente o mesmo, mas usam uma infraestrutura muito diferente, aplicando assim diferentes restrições nas classes que você deseja serializar / desserializar e fornecendo diferentes graus de flexibilidade no ajuste do processo de serialização / desserialização.

Pois DataContractJsonSerializervocê deve marcar todas as classes que deseja serializar usando DataContractatrtibute e todos os membros usando DataMemberattribute. Da mesma forma que se algumas de suas classes tiverem membros de enum, os enums também devem ser marcados como DataContracte cada membro de enum - com EnumMemberatributo. Também DataContractJsonSerializerpermite um controle preciso sobre todo o processo de serialização / desserialização, alterando a lógica de resolução de tipos e substituindo os tipos serializados por substitutos.

Pois JavaScriptSerializervocê deve fornecer um construtor sem parâmetros se planeja desserializar objetos da string json.

Para mim, geralmente uso JavaScriptSerializerem lógica de apresentação, onde há um modelo simples que desejo renderizar em Json junto com a página, sem solicitações adicionais de ajax. E geralmente não preciso desserializá-los de volta para c # - portanto, não há sobrecarga. Mas se for lógica de persistência, onde eu quero salvar objetos em um armazenamento de dados (geralmente armazenamento sem sql), para carregá-los mais tarde, eu prefiro usar DataContractJsonSerializerporque a sobrecarga de colocar atributos vale a pena de flexibilidade no ajuste do processo de serialização / desserialização, especialmente quando se trata de carregar dados serializados nos objetos da versão mais recente, com definições atualizadas

achekh
fonte
2

Pessoalmente, acho que isso DataContractJsonSerializercheira a excesso de engenharia. Eu pularia e seguiria JavaScriptSerializer. Caso JavaScriptSerializernão esteja disponível, você pode usar FridayThe13th (uma biblioteca que escrevi; p).

JP Richardson
fonte
Json.Net está em toda parte. .Net 2.0, 3.5, 4.0, Silverlight, WindowsPhone
LB