c# - serializar - newtonsoft json example serialize
¿Cuál es la diferencia entre DataContractJsonSerializer y JavaScriptSerializer? (3)
.NET Framework viene con System.Runtime.Serialization.Json.DataContractJsonSerializer y System.Web.Script.Serialization.JavaScriptSerializer , ambos de / serialize JSON. ¿Cómo puedo saber cuándo elegir uno de estos tipos sobre el otro? MSDN no aclara cuáles son sus ventajas relativas.
Tenemos varios proyectos que consumen o emiten JSON, y la clase seleccionada hasta ahora ha dependido de la opinión del desarrollador primario de cada proyecto. Algunos son simples, dos tienen una lógica compleja con respecto a la producción de tipos administrados de JSON (los tipos no se relacionan estrechamente con las transmisiones) pero no tienen ningún énfasis en la velocidad, uno requiere velocidad. Ninguno interactúa con WCF, al menos desde ahora.
Si bien estoy interesado en bibliotecas alternativas, espero que alguien también tenga una respuesta a mi pregunta.
Ambos hacen aproximadamente lo mismo pero usan una infraestructura muy diferente, por lo tanto, aplican diferentes restricciones en las clases que desean serializar / deserializar y proporcionan un grado de flexibilidad diferente para ajustar el proceso de serialización / deserialización.
Para DataContractJsonSerializer
, debe marcar todas las clases que desea serializar utilizando el atributo DataContract
y todos los miembros que usen el atributo DataMember
. Además de que algunas de las clases tienen miembros enumerados, las enumeraciones también deben marcarse como DataContract
y cada miembro EnumMember
con el atributo EnumMember
. También DataContractJsonSerializer
permite un control fino sobre todo el proceso de serialización / deserialización al alterar la lógica de resolución de tipos y reemplazar los tipos que serializa con sustitutos.
Para JavaScriptSerializer
, debe proporcionar un constructor sin parámetros si planea deserializar objetos de json string.
Para mí, generalmente uso JavaScriptSerializer
en lógica de presentación, donde hay un modelo simple que quiero representar en Json junto con la página, sin solicitudes adicionales de ajax. E incluso generalmente no tengo que deserializarlos de nuevo a c #, así que no hay gastos generales. Pero si es lógica de persistencia, donde quiero guardar objetos en un almacén de datos (generalmente almacenamiento no-sql), para cargarlos más tarde, prefiero usar DataContractJsonSerializer
porque la sobrecarga de poner atributos vale la flexibilidad en el proceso de serialización / deserialización , especialmente cuando se trata de cargar datos serializados en los objetos de la versión más nueva, con definiciones actualizadas
El DataContractJsonSerializer está diseñado para su uso con aplicaciones de cliente WCF donde los tipos seriados son generalmente clases POCO con el atributo DataContract aplicado a ellos. Sin DataContract, sin serialización. El mecanismo de mapeo de WCF hace que el envío y la recepción sean muy simples, pero solo si su plataforma es homogénea. Si comienza a mezclar en diferentes conjuntos de herramientas, su programa podría ir hacia los lados.
JavaScriptSerializer puede serializar cualquier tipo, incluidos los tipos anónimos (unidireccionales), y lo hace de una manera más conforme. Pierdes el "automagic" de WCF, pero obtienes más opciones de integración.
Como puede ver en los comentarios, hay muchas opciones para la serialización de AJAX, y para responder a sus preguntas sobre velocidad y mantenimiento, podría valer la pena investigarlas para encontrar una solución que satisfaga las necesidades de todos los equipos. reducir los problemas de mantenimiento a largo plazo, ya que todos hacen las cosas a su manera.
2014-04-07 ACTUALIZACIÓN: sugiero usar JSON.NET si puede. Ver http://james.newtonking.com/json Comparación de características para una revisión de las 3 bibliotecas consideradas en esta pregunta.
2015-05-26 ACTUALIZACIÓN: si su empresa requiere el uso de productos con licencia comercial, o si necesita hasta el último rendimiento, también puede visitar https://servicestack.net/ .
Personalmente, creo que DataContractJsonSerializer
huele a exceso de ingeniería. Lo omitiría e iría con JavaScriptSerializer
. En caso de que JavaScriptSerializer
no esté disponible, puede utilizar FridayThe13th (una biblioteca que escribí; p).