【问题标题】:Json.NET serialization of ObservableCollection "cannot be used on the current platform"ObservableCollection的Json.NET序列化“不能在当前平台上使用”
【发布时间】:2014-10-05 15:17:22
【问题描述】:

我在尝试使用 Json.NET 将 json 反序列化为我的自定义类型时遇到了一个奇怪的问题:

public class Shot 
{
    [JsonProperty("frames")]
    public ObservableCollection<Frame> Frames
    {
        get { return Frames = _frames ?? new ObservableCollection<Frame>(); }
        set { _frames = value; }
    }
}

产生了这个异常:

API 'System.Collections.ObjectModel.ObservableCollection1[[AxisCtrl.Core.Model.Frame, AxisCtrl.Core.Logic, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]..ctor(System.Collections.Generic.List1[AxisCtrl.Core.Model.Frame])' 不能在当前平台上使用。看 http://go.microsoft.com/fwlink/?LinkId=248273 了解更多信息。

当我尝试从 Windows 8.1 Windows 商店应用程序中将 json 反序列化为这种类型,但在我的单元测试环境中的“类库”类型项目中运行时:

提到的 url 已经失效并且正在重定向到主页,所以那里没有太多帮助。 奇怪的是,在我开始将我的项目和类拆分为不同的结构之前,这已经奏效了。但是我没有移动 Shot 类或更改它所包含的项目类型。

Shot 类在“.NET Framework 4.5 及更高版本”、“Windows 应用商店应用程序 (Windows 8) 及更高版本”和“Windows Phone 8”的可移植类库类型项目中定义,主项目是 Windows 8.1应用。

对这里发生的事情有什么想法吗?

【问题讨论】:

    标签: c# microsoft-metro json.net windows-8.1


    【解决方案1】:

    问题是 Json.NET 用于 ObservableCollection 的 ctor 在 WinRT 中不可用

    http://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx

    你可以通过覆盖合约解析器来绕过这个

    ContractResolver : DefaultContractResolver
    {
         public override JsonContract ResolveContract(Type type)
         {
            //check if type is ObservableCollection
            if (type.GetTypeInfo().IsGenericType
                     && type.GetTypeInfo().GetGenericTypeDefinition() 
                              == typeof(ObservableCollection<>))
            {
                //use list as default contract
                var c = (JsonArrayContract) 
                          base.ResolveContract(typeof(List<>)
                              .MakeGenericType(type.GenericTypeArguments[0]));
                //use Activator to create instance
                c.DefaultCreator = () => Activator.CreateInstance(type);
                return c;
             }
             else return base.ResolveContract(type);
         }
    }
    

    然后在名为ContractResolverJsonSettingsJsonSerializer 属性中设置合同解析器的实例。

    【讨论】:

    • 谢谢,但是当我添加那个类时,PCL 编译得很好,但是我的主项目会产生这个错误:“类型宇宙无法解析程序集:Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed."。当我删除类时,项目编译并运行良好。
    • @atsjoo,您的主(可执行)项目是否引用了 Json.Net?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 2020-06-08
    相关资源
    最近更新 更多