JSON SerializeObject无法使用iOS硬件上的抽象成员序列化类

时间:2018-02-15 23:13:44

标签: xamarin.forms xamarin.ios json.net

当我尝试在实际的iPhone上运行我的Xamarin Forms应用程序时,它失败并出现System.MissingMethodException:"类型为' System.ComponentModel.ReferenceConverter'的构造函数。没找到。"

它可以在iOS模拟器以及Android硬件和虚拟设备上正常工作。

我已经能够将其缩小到以下场景:使用引用成员的接口序列化对象:

public class Widget {
    public ISprocket Sprocket { get; set; };
}

public interface ISprocket {
  int SprocketId { get; set; }
}

执行行:

var w = new Widget { Sprocket = new Sprocket { SprocketId = 1 } };
string result = JsonConvert.SerializeObject(w);

无处不在(看似)除了我的iPhone 8+,它会抛出System.MissingMethodException

我使用的是最新版本的XF(2.5.0.122203)和JSON.NET(10.0.3)。

要重新创建此问题,请使用名为" TestBed"的iOS客户端创建新的Xamarin Forms解决方案。通过nuget添加Newtonsoft.Json,然后创建一个页面 " TestBedPage"具有以下内容:

using System;
using Newtonsoft.Json;
using Xamarin.Forms;

namespace TestBed
{
    public class TestBedPage : ContentPage
    {
        public TestBedPage()
        {
            try
            {
                var m = new Widget { Sprocket = new Sprocket { SprocketId = 1 } };
                var st = JsonConvert.SerializeObject(m);
                Content = new Label { Text = st };
            } catch (Exception ex) {
                Content = new Label { Text = ex.ToString() };
            }
        }
    }

    public class Widget
    {
        public string Title { get; set; } = string.Empty;
        public ISprocket Sprocket { get; set; }
    }

    public interface ISprocket
    {
        int SprocketId { get; set; }
    }

    public class Sprocket : ISprocket
    {
        public int SprocketId { get; set; }
    }
}

将其部署到iPhone并运行。你应该得到一堆MissingMethodException堆栈跟踪。

有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

问题是某些东西试图通过Activator类通过System.ComponentModel.ReferenceConverter ctor实例化System.Type实例,但由于它未在您的应用程序中直接引用,因此它会被删除managed linker

您需要提供custom linker configuration file,将其添加到您的Xamarin.iOS项目中。

请参阅here