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

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

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

}

最佳答案

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

new JsonSerializerSettings
                {
                    TypeNameHandling = TypeNameHandling.Objects,
                    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full
                }

关于silverlight - 如何在 Json.NET Silverlight 中使用 TypeNameHandling.Objects 反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860565/

相关文章:

c# - 大多数 LOB 应用程序使用哪种技术?

silverlight - 使用 Silverlight 进行数据绑定(bind)

c# - Json.Net 中的 PreserveReferencesHandling 和 ReferenceLoopHandling 有什么区别?

c# - 如何将 HttpWebRequest 与 GET 方法一起使用

c# - 使用 Entity Framework 从 WCF RIA 服务调用另一个 WCF 数据服务

Silverlight 4、RIA 服务和 TFS 2010 构建服务器

c# - 使用数组反序列化响应

c# - 使用 JSON.NET 将已知和未知的 JSON 字段反序列化为 CLR 对象

c# - 有选择地使用默认的 JSON 转换器

c# - 解析具有多个对象的 Json newtonsoft