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

时间:2012-06-22 00:16:35

标签: c# javascript asp.net json jquery

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

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:Value不能为null。   参数名称:类型]      System.Activator.CreateInstance(Type type,Boolean nonPublic)+9635174      System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+431      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+71      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147      System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)+199      System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeList(Int32 depth)+141      System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)+231      System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input,Int32 depthLimit,JavaScriptSerializer serializer)+80      System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)+44      System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input)+74      C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.CreateObject(Product&amp; item):720      C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.Save():356      在C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e):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 sourceControl,String eventArgument)+13      System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563

我确定错误是由于此__type成员造成的。如何将此字符串反序列化?或者我如何使用$.ajax()检索我的商品而不是获取该__type成员?

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

  

[MissingMethodException:没有为&#39; Shop.JSON.Product&#39;。的类型定义无参数构造函数。      System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+582589      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+71      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147      System.Web.Script.Serialization.ObjectConverter.AddItemToList(IList oldList,IList newList,Type elementType,JavaScriptSerializer serializer,Boolean throwOnError)+87      System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList列表,Type类型,JavaScriptSerializer序列化程序,Boolean throwOnError,IList&amp; convertedList)+674      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+112      System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)+147      System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer,String input,Type type,Int32 depthLimit)+66      System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(String input)+74      C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.CreateObject(Product&amp; item):720      C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.Save():356      在C:\ Documents and Settings \ path \ UI \ Admin \ Products \ Detail.cs中的Shop.UI.Admin.Products.Detail.SaveClick(Object sender,EventArgs e):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 sourceControl,String eventArgument)+13      System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+36      System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+5563

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

2 个答案:

答案 0 :(得分:0)

这条线......

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

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

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

答案 1 :(得分:0)

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

它完美无缺,我现在可以反序列化我的对象了!这么简单的解决方案;我希望我早点想到这一点。