JsonSerializationException 'Unable to find a constructor' on Xamarin.Android



我的代码有一个非常奇怪的问题,考虑到我半年前没有这个问题,这是一个非常新的问题。长话短说,我在Xamarin中制作了一个应用程序,并在大约半年前在所有3家商店(App Store,Google Play和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 属性是一种更集中的方法,用于确保链接器不会删除成员,如果您仍然希望它通常对代码执行操作。

例:

[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
}

相关内容

  • 没有找到相关文章

最新更新