如何在Json.NET Silverlight中使用TypeNameHandling.Objects反序列化?

Kir*_*all 7 silverlight json.net

尝试在Silverlight中反序列化时出现异常.Test1失败,而Test2成功.我也尝试将TypeNameAssemblyFormat同时用于Simple和Full,但得到相同的结果.Test2可以解析程序集,为什么不能Json.NET?

更新:忘记提及我试图反序列化的类型是在与反序列化发生的silverlight程序集不同的程序集中定义的.

这两个测试都在非Silverlight .NET应用程序中运行.

如何反序列化具有类型名称的json字符串?

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个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;

}
Run Code Online (Sandbox Code Playgroud)

Vyv*_*vIT 7

尝试添加设置JsonConvert.DeserializeObject<T>(json, Settings),其中"设置"为:

new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
                }
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这个并没有用.我仍然得到异常System.IO.FileLoadException:无法加载文件或程序集...或其依赖项之一.请求的程序集版本与已在应用程序域中绑定或在清单中指定的内容冲突...我发现问题是如果未包括完整的程序集信息(包括版本),则它不起作用.我也很困惑为什么这是被接受的,因为OP专门发布了TypeNameAssemblyFormat = FormatterAssemblyStyle.Full不起作用. (2认同)