C# JsonSerializationException';找不到构造函数';关于Xamarin.Android

C# JsonSerializationException';找不到构造函数';关于Xamarin.Android,c#,android,xamarin,json.net,xamarin.android,C#,Android,Xamarin,Json.net,Xamarin.android,我的代码有一个非常奇怪的问题,考虑到半年前我还没有这个问题,这是一个相当新的问题。长话短说,我在Xamarin制作了一个应用程序,大约半年前在所有3家商店(AppStore、GooglePlay和Microsoft Store)上发布了它 昨天,一位用户报告了Android应用程序的一个问题,在我修复并重新编译之后,我现在遇到了一个新的Json.NET错误 例外是 Newtonsoft.Json.JsonSerializationException: Unable to find a const

我的代码有一个非常奇怪的问题,考虑到半年前我还没有这个问题,这是一个相当新的问题。长话短说,我在Xamarin制作了一个应用程序,大约半年前在所有3家商店(AppStore、GooglePlay和Microsoft Store)上发布了它

昨天,一位用户报告了Android应用程序的一个问题,在我修复并重新编译之后,我现在遇到了一个新的Json.NET错误

例外是

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type Rowlog.Common.Dtos.CompressedTripData. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'tripCoordinates', line 1, position 19.
在您提问之前,是的,Rowlog.Common.Dtos.CompressedTripData确实有一个无参数构造函数(好吧,它根本没有,我们都知道这是一样的)

正如我所说,这是当我从Android设备上的服务器加载CompressedTripData对象时。在iOS和Windows Phone上加载完全相同的对象不会有任何问题。 我猜这可能是最近Json.NET或Xamarin.Android的变化造成的(其他应用程序仍在使用大约半年前的Json.NET库。不确定此后是否有任何更新)


是否有其他人遇到过类似问题,如果是,您是如何解决的?

在项目属性的“Android选项”选项卡中,有一个“链接器”选项卡。 “链接”下拉列表中的选定选项是“仅Sdk程序集”还是“Sdk和用户程序集”


如果是后者,则链接时跳过无参数构造函数,因为未检测到使用。因此,将其更改为“仅Sdk程序集”。

如果您仍然希望链接器对代码进行常规处理,则保留属性是一种更加集中的方法,可以确保链接器不会删除成员

例如:

[Preserve]
[JsonConstructor]
private AlertRequest(bool fake_arg)
{
    // fake_arg is to have a unique ctor that we exclusively
    // use in JSON de-serialization via JsonConstructor attribute.
    // Preserve attribute ensures Xamarin linker does not remove,
    // as there are no direct uses of this ctor in the code base
}

是的,这就是问题所在。谢谢你,伟大的先生,你真是个救命恩人!非常感谢您这么做-我在发布版本中遇到了这个错误,但不是调试版本。这为我节省了很多时间,因为这些链接器选项的效果并不明显(我打算让JSON.NET更多地参与反序列化)。我最初的印象是,这个设置是为了确定链接到Android应用程序包的DLL,而不是单独的库包…非常感谢!我自己无法解决。当我尝试此操作时,会出现异常:
链接程序集任务失败。。。无法解析Mono.Security.MonoTlsProviderFActoryDelegate
建议在SO@Akbari上提出新问题。这些天我真的不怎么使用Android。