首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有派生类型的ASP.NET ScriptService反序列化问题

具有派生类型的ASP.NET ScriptService反序列化问题
EN

Stack Overflow用户
提问于 2010-09-29 05:51:14
回答 2查看 6K关注 0票数 7

我有一个ScriptService web方法(.NET 3.5),它接受抽象基类型的单个参数:

代码语言:javascript
复制
[WebMethod(EnableSession=true)]
[ScriptMethod()]
public bool Test(Item item) { ... }

和:

代码语言:javascript
复制
namespace Namespace {
public abstract class Item
{
    public int id;
}

public class Group : Item
{
    public Item[] items;
}

public class Instance : Item
{
    public string whatever;
}
}

通常,当调用该方法时,item将是一个包含Instance和/或Group对象的Group。我从jQuery调用这个服务;我不使用微软客户端框架。对其他方法的调用工作正常。

问题:当我进行调用时,会在调用方法之前抛出一个异常。例如,如果我的电话是:

代码语言:javascript
复制
POST /WebService.asmx/Test HTTP/1.1
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*

{"item":{"id":0,"__type":"Namespace.Group","items":[]}}

...I得到一个InvalidOperationException

代码语言:javascript
复制
{"Message":"Operation is not valid due to the current state of the object.","StackTrace":"   at System.Web.Script.Serialization.ObjectConverter.ConvertDictionaryToObject(IDictionary`2 dictionary, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n   at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

如果我删除JSON对象的__type成员或将其更改为Namespace.Item (并从Item中删除abstract修饰符),异常就会消失,但由此产生的反序列化对象显然是无用的。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-29 06:20:55

啊哈!点击这个问题右侧的相关链接,我发现an answer帮助我解决了这个问题。

GenerateScriptType属性必须应用于web服务类:

代码语言:javascript
复制
[WebService( ... )]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[GenerateScriptType(typeof(Group))]
[GenerateScriptType(typeof(Instance))]
public class WebService : System.Web.Services.WebService
{
    [WebMethod(EnableSession=true)]
    [ScriptMethod()]
    public bool Test(Item item) { ... }
}

没有这些属性,反序列化器就不知道我的派生类型。

票数 15
EN

Stack Overflow用户

发布于 2018-11-23 12:44:03

我可以使用Newtonsofts JsonConvert解决这个问题,如下所示。

代码语言:javascript
复制
[System.Web.Services.WebMethod]      
public static void MyAjaxCallingMethod(object inputs)
    {           
    string stingDataFromAjaxCall = JsonConvert.SerializeObject(inputs);
            MyObject myObj = JsonConvert.DeserializeObject<MyObject>(stingDataFromAjaxCall);
            ....}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3819071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档