Это решение сработало для меня, хотя мне неудобно вручную взламывать json до десериализации. Я думаю, что другой подход может состоять в том, чтобы иметь общую сборку модели с тем же именем и иметь сборку / версию silverlight.

учаю исключение при попытке десериализации в Silverlight. Test1 не выполняется, а Test2 - успешно. Я также пробовал TypeNameAssemblyFormat для простого и полного, но получить те же результаты. Test2 может разрешить сборку, почему не может Json.NET?

Обновить: Забыл упомянуть, что тип, который я пытаюсь десериализовать, определен в сборке, отличной от сборки silverlight, где происходит десериализация.

Оба теста работают в не-Silverlight .NET-приложении.

Как я могу десериализовать строку json, которая имеет typenames?

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;
        }
    }
}

Этот Test2 успешно:

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;

}

Ответы на вопрос(0)

Ваш ответ на вопрос