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.
fonte
Respostas:
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/ .
fonte
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
DataContractJsonSerializer
você deve marcar todas as classes que deseja serializar usandoDataContract
atrtibute e todos os membros usandoDataMember
attribute. Da mesma forma que se algumas de suas classes tiverem membros de enum, os enums também devem ser marcados comoDataContract
e cada membro de enum - comEnumMember
atributo. TambémDataContractJsonSerializer
permite 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
JavaScriptSerializer
você deve fornecer um construtor sem parâmetros se planeja desserializar objetos da string json.Para mim, geralmente uso
JavaScriptSerializer
em 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 usarDataContractJsonSerializer
porque 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 atualizadasfonte
Pessoalmente, acho que isso
DataContractJsonSerializer
cheira a excesso de engenharia. Eu pularia e seguiriaJavaScriptSerializer
. CasoJavaScriptSerializer
não esteja disponível, você pode usar FridayThe13th (uma biblioteca que escrevi; p).fonte