Recibo una excepción cuando intento deserializarme en Silverlight. Test1 falla, mientras que Test2 tiene éxito. También probé TypeNameAssemblyFormat en Simple y Full, pero obtuve los mismos resultados. Test2 puede resolver el ensamblaje, ¿por qué no puede Json.NET?¿Cómo puedo deserializar con TypeNameHandling.Objects en Json.NET Silverlight?
Update: Ha olvidado mencionar que el tipo que estoy tratando de deserializar se define en un ensamblaje diferente del ensamblaje silverlight donde ocurre la deserialización.
Ambas pruebas funcionan en una aplicación .NET no Silverlight.
¿Cómo puedo deserializar una cadena json que tenga nombres tipográficos?
private void Test1()
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
string json1 = "{\"$type\":\"AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly\",\"X\":0.0,\"Y\":0.0,\"SpatialReference\":null}";
try
{
var n1 = JsonConvert.DeserializeObject<NTPoint>(json1, settings);
//Error resolving type specified in JSON 'AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly'.
//Could not load file or assembly 'NetworkTrace.DTO.Assembly, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
//The requested assembly version conflicts with what is already bound in the app domain or specified in the manifest.
//(Exception from HRESULT: 0x80131053)
}
catch (Exception ex)
{
while (ex != null)
{
Debug.WriteLine(ex.Message);
ex = ex.InnerException;
}
}
}
Este Prueba2 tiene éxito:
private void Test2()
{
var pnt1 = new AmberGIS.NetworkTrace.DTO.NTPoint();
Debug.WriteLine(pnt1.GetType().AssemblyQualifiedName);
// "AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
string fullName = "AmberGIS.NetworkTrace.DTO.NTPoint, NetworkTrace.DTO.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
var t = Type.GetType(fullName);
var pnt2 = Activator.CreateInstance(t) as NTPoint;
}
¿por qué no añades su solución como respuesta y lo acepta para que lo haga no aparece en la lista sin respuesta? – keyr
@keyr hecho, pero esperaba una solución menos hacky. –