反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误
Posted
技术标签:
【中文标题】反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误【英文标题】:"Newtonsoft.Json.JsonSerializationException unable to find constructor to use for types" error when deserializing class 【发布时间】:2015-09-13 05:13:34 【问题描述】:我正在Xamarin
android 中开发应用程序。我有一个启动画面,我在其中序列化一个类并使用Intent
将其传递给MainActivity
。当我尝试在 MainActivity
中反序列化它时,我收到一条错误消息:
"SerializationException unable to find constructor to use for types"
序列化:
void LoadData()
Currency currency = new Currency(this);
intent = new Intent(this, typeof(MainActivity));
intent.PutExtra("currency", Newtonsoft.Json.JsonConvert.SerializeObject(currency));
StartActivity(intent);
反序列化:
cur = Newtonsoft.Json.JsonConvert.DeserializeObject<Currency> (Intent.GetStringExtra("currency")); // I get the error here
类构造函数:
public Currency(Context context)
thiscontext = context;
在将参数Context context
添加到构造函数后,我开始遇到此问题。
这是什么原因造成的?我该如何解决?
是否可以序列化/反序列化具有参数的类?
【问题讨论】:
那么您希望反序列化传递给该构造函数的值是多少?你真的需要这个参数来反序列化吗? AFAIK,Currency 类的默认 ctor 不存在,这就是您收到此错误的原因;如果你创建一个默认的ctor(不带参数),我相信你不会遇到这个问题 @JonSkeet 抱歉,我没听懂你的问题,你的意思是我的课堂上是否需要那个参数? @rt2800 这是否意味着我不能序列化/反序列化有参数的类? 那么你是如何使用那个参数的?为什么需要上下文? 【参考方案1】:您需要在 Currency 类中有一个空的构造函数才能对其进行反序列化。
【讨论】:
不是真的,你可以有这样的解决方案:***.com/a/28155770/97615【参考方案2】:另一件事可能会导致此问题,如果您在您的 android 项目中启用了完整链接。您需要使用
保留类和成员[Runtime.Preserve(AllMembers = true)]
public class Currency
【讨论】:
你在这里几乎是正确的......这是选项上的链接类型 => build ios @Daniel 是的,Ios 也有类似的行为。我写 Android 是因为问题是针对 android 的。 IOS也可以应用 你说得对,这个问题似乎也是由最新的 Xamarin 指南引起的,该指南使用 iOS 应用中已弃用的 API 启用完整链接以绕过 Xamarin.Forms。以上是关于反序列化类时出现“Newtonsoft.Json.JsonSerializationException 无法找到用于类型的构造函数”错误的主要内容,如果未能解决你的问题,请参考以下文章
Newtonsoft.json 序列化和反序列化基/继承,其中类来自共享项目
Newtonsoft.Json.JsonConvert 从同一个类中序列化和反序列化
Json.JsonSerializationException : 无法反序列化当前 JSON 对象
C#中使用Newtonsoft.Json序列化和反序列化自定义类对象
具有 IEnumerable<ISomeInterface> 类型属性的 NewtonSoft.Json 序列化和反序列化类