繁体   English   中英

反序列化错误-值不能为null /未定义无参数构造函数

[英]Error Deserializing - Value cannot be null / No parameterless constructor defined

我有一个产品编辑页面,可让您添加“相关项目”。 当访问页面以编辑产品时,它将在服务器上序列化其初始“相关项”,并存储在隐藏字段中。 当您添加相关项时,我使用$.ajax()检索了javascript / jQuery中的项数组。 $.ajax()正在调用服务器端方法,该方法返回对象列表,如下所示:

Fyodor.JSON.SearchResult r = new Fyodor.JSON.SearchResult();
DataSet ds = retrieveData();

foreach (DataRow row in ds.Tables[0].Rows)
{
    JSON.Product i = new JSON.Product();
    //set all Product data in `i`

    if (!string.IsNullOrEmpty(i.PartNumber))
    {
        r.Results.Add(i);
    }
}
//set r.TotalPageCount
return r;

当我得到这个数组的项目回到我的javascript,每个项目一直给人成员__type等于JSON.Product 最初对项目进行序列化时,此__type成员不存在。 我使用JSON.stringify(my_arrar_of_items)序列化新集合并将其存储回隐藏字段中。
当我保存产品并检索隐藏字段的值并尝试使用时反序列化

JavaScriptSerializer s = new JavaScriptSerializer();
relatedItems = s.Deserialize<List<JSON.Product>>(hiddenField.Value);

我收到一个错误:

[ArgumentNullException:值不能为null。 参数名称:类型System.Activator.CreateInstance(类型类型,布尔非公共)+9635174 System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2字典,类型类型,JavaScriptSerializer序列化器,布尔型throwOnError,对象和转换对象)+431 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(对象o,类型类型,JavaScriptSerializer序列化器,布尔型throwOnError,对象和转换对象)+71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象o,类型类型,JavaScriptSerializer序列化器,布尔型throwOnError,Object和convertObject)+147 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32深度)+199 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32深度)+141 System.Web.Script.Serialization。 JavaScriptObjectDeserializer.DeserializeInternal(Int32深度)+231 System.Web.Script.Serialization.JavaScriptObjectDeserialize r.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer序列化器)+80 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer序列化器,字符串输入,类型类型,Int32 depthLimit)+44 System.Web.Script.Serialization.JavaScriptSerializer .Deserialize(字符串输入)+74 C:\\ Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs:720 Shop.UI.Admin中的Shop.UI.Admin.Products.Detail.CreateObject(Product&item) C:\\ Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs中的Products.Detail.Save():356 C:\\中的Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e) Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs:121 System.Web.UI.WebControls.Button.OnClick(EventArgs e)+118 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+ 112 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceContr ol,字符串eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36 System.Web.UI.Page.ProcessRequestMain(布尔值includeStagesBeforeAsyncPoint,布尔值includeStagesAfterAsyncPoint)+5563

我肯定知道由于此__type成员引起的错误。 如何获得反序列化的字符串? 或者,如何使用$.ajax()检索我的商品,而不获取织补__type成员?

我尝试过但无法解决的问题:在我读过的SO帖子中(我现在找不到),它说是要给您要序列化的对象的构造函数提供protected internal访问级别,并且不会添加__type成员。 该类实际上没有构造函数或方法,因此我使用该访问级别创建了一个构造器或方法,并且确定__type成员不存在。 但是现在我遇到了一个新的错误:

[MissingMethodException:没有为'Shop.JSON.Product'的类型定义无参数的构造函数。] System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2字典,类型类型,JavaScriptSerializer序列化器,布尔型throwOnError,对象和转换对象)+582589 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(对象o,类型类型,JavaScriptSerializer序列化器,布尔型throwOnError,对象和转换对象)+71 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象o,类型类型,JavaScriptSerializer序列化器,布尔throwOnError,Object和convertObject)+147 System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList,IList newList,Type elementType,JavaScriptSerializer序列化器,布尔throwOnError)+87 System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList列表,类型类型,JavaScriptSerializer序列化器,布尔throwOnError,IList和convertList)+674 Syst em.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&convertObject)+112 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer序列化器,布尔型throwOnError,Object和convertObject)+147 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer序列化器,字符串输入,类型类型,Int32 depthLimit)+66 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(字符串输入)+ 74 C:\\ Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs:720 Shop.UI.Admin.Products.Detail.CreateObject(Product&item)Shop.UI.Admin.Products.Detail.Save()在C:\\ Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs:356 Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e)在C:\\ Documents and Settings \\ path \\ UI \\ Admin \\ Products \\ Detail.cs:121 System.Web.UI.WebControls.Button.OnClick(EventArgs e)+ 118 System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串eventArgument)+112 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+10 System.Web.UI.Page .RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563

我不明白,因为我创建的新构造函数是无参数的。我在做什么错?

这行是...

JSON.Product i = new JSON.Product();

在与您创建的构造函数相同的程序部分中,还是在派生类中? 如果没有,那将解释为什么找不到构造函数。

DotNetPerls中 :[protected internal]表示内部可访问性(该程序的所有部分都可以使用该成员)和受保护的可访问性(所有派生类都可以使用该成员)。

我找到了一个非常简单的解决方案。 当我通过$.ajax()从服务器将项目检索回javascript时,我使用delete运算符从对象中删除了.__type属性。

它运行完美,现在我可以反序列化我的对象了! 这样简单的解决方案; 希望我早些想到这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM