type serialize newtonsoft net from deserializeobject deserialize silverlight json.net anonymous-types

silverlight - net - newtonsoft json deserializeobject



Serializar tipos anĂ³nimos en Silverlight con json.net (5)

Tengo problemas para serializar un tipo anónimo solo en la plataforma de Silverlight. Tengo un código en .net 4.0 y .netcf que funciona bien.

Esta línea aquí

Newtonsoft.Json.JsonConvert.SerializeObject(new { Something = "yup" });

arroja un chico con un nombre apropiado, JsonSerializationException:

Error getting value from ''Something'' on ''<>f__AnonymousType0`1[System.String]''.

Intenté 4.0r1 y 4.0r2. ¿Estoy haciendo algo mal o estoy tomando pastillas locas?


¿Hay alguna razón específica por la que quiera usar Json.NET? De lo contrario, es posible que desee probar el serializador incorporado (en el espacio de nombres System.Runtime.Serialization). Debo admitir que nunca lo intenté con tipos anónimos, así que no estoy seguro de si esto te será útil. De todos modos, aquí está la clase que uso para la serialización / deserialización:

using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.IO; using System.Text; using System.Runtime.Serialization.Json; namespace GLS.Gui.Helper { public static class SerializationHelper { public static string SerializeToJsonString(object objectToSerialize) { using (MemoryStream ms = new MemoryStream()) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType()); serializer.WriteObject(ms, objectToSerialize); ms.Position = 0; using (StreamReader reader = new StreamReader(ms)) { return reader.ReadToEnd(); } } } public static T Deserialize<T>(string jsonString) { using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(ms); } } } }


El problema es que los tipos anónimos se definen como clases internas por el compilador. JSON.NET depende de la reflexión para que funcione, y en Silverlight, la reflexión a través de los bordes del ensamblaje funciona solo para los tipos públicos (cuando se utilizan ensamblajes parcialmente confiables como este).

Creo que DataContractJsonSerializer como se menciona en la respuesta anterior es el camino a seguir en este caso, ya que es parte del marco y debe tener privilegios adicionales.

Otra cosa que debes probar es usar diccionarios o ExpandoObject en lugar de tipos anónimos, pero YMMV.



Para complementar las otras respuestas con otra solución, tenga en cuenta que la reflexión (y por lo tanto la serialización de tipos anónimos) tendrá éxito cuando se ejecuta con confianza elevada.


La respuesta es simple;) Agregue [assembly: InternalsVisibleTo ("Newtonsoft.Json")] a AssemblyInfo.cs y listo ... Tengo exactamente el mismo problema y este atributo resolvió mi problema de serialización / deserialización.

AssemblyInfo.cs

[assembly: InternalsVisibleTo("Newtonsoft.Json")]