wcf反序列化:我们可以推断出javascript类型吗?

时间:2011-12-19 13:58:09

标签: jquery asp.net wcf deserialization datacontract

我正在使用JQuery和ajax调用asp.net webservice,使用json传输数据。 我正在创建将json字符串化的javascript对象。我需要我的webmethod来检索这些特定的对象类型,但我的参数类型是一个基类,这些对象继承自我的基类,如下所示:

[DataContract]
[KnownType(typeof(TextareaObject))]
[KnownType(typeof(TextObject))]
public class FormElement
{
    public FormElement()
    {}
}

和:

  [DataContract(Name = "textObject")]
public class TextObject : FormElement
{
      [DataMember]
    public string question { get; set; }

    public TextObject(string question)
    {
            this.question = question;
}
}

和我的网络方法:

 [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
[ServiceKnownType(typeof(TextObject))]
[ServiceKnownType(typeof(TextareaObject))]
public void SaveForm(List<FormElement> formobjects)
{
   ...

}

这就是我创建javascript对象的方式(我只复制代码的相关示例):

     //objects to serialize
    function textObject(question) {
        this.question = question;
    }

  //objects to serialize
    function textareaObject(question, rownumber) {
        this.question = question;
        this.rownumber = rownumber;
    }
  var objectarray = new Array();
 if (type == 'text') {
                textobject1 = new textObject(typedquestion);
                objectarray.push(textobject1);
            }
            else if (type == 'textarea') {
                var rownumber = $(elm).children('textarea').attr('rows');
                textareaobject1 = new textareaObject(typedquestion, rownumber);
                objectarray.push(textareaobject1);
            }

  var formobjects = JSON.stringify(objectarray);

 $.ajax({
            type: "POST",
            //Page Name (in which the method should be called) and method name
            url: urlhtml,
            data: '{"formobjects":' + formobjects + '}',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
            //dosmth
            }
        });

我希望asp.net服务器能够反序列化我的数组中的正确类型。 但是在我的web方法中,“formobjects”都是FormElement类型,即使使用serviceknowntype属性,我也无法获得它们的真实类型。是因为javascript没有强类型,我无法检索具体类型?因为字符串化的json不会给出具体的类型? 我试过

 textObject.prototype = new textObject(typedquestion);
            objectarray.push(textObject.prototype);

并且json给出了类似的东西:

{"formobjects":{"textObject": {"question":"test"}}}

但是服务器端同样老旧,我只在webmethod中获取FormElement类型而且我无法投射。

也许我想做的事是不可能的.. 无论如何,谢谢你!

3 个答案:

答案 0 :(得分:0)

没有类型信息,因此WCF序列化程序不知道要反序列化的类型。

如果有办法根据json的格式计算出来,你可以编写自己的序列化程序来处理这种方法的反序列化 - 请参阅this MSDN blog post了解如何为WCF编写自定义序列化程序。 / p>

答案 1 :(得分:0)

如果你在c#4上,我认为这是你可以使用新类型dynamic的情况:

http://msdn.microsoft.com/en-us/library/dd264736.aspx

答案 2 :(得分:0)

我找到了答案。就像rich.okelly说的那样,没有用弱类型语言发送的类型信息是javascript,因为javascript类不是像.net那样的真实类。但微软预计,你需要使用他们所称的&#34;输入提示&#34;,这意味着你要添加&#34; __ type&#34;属性到你的javascript对象,并在第一个位置像这样:

    //objects to serialize
    function textObject(__type, question) {
        this.__type = __type;
        this.question = question;       
    }
(...)
      var textobject1 = new textObject("textObject:#",typedquestion);

甚至将其添加到课程本身,这样您就不会每次都添加它来设置它:

    //objects to serialize
    function textObject(question) {
        this.__type = "textObject:#";
        this.question = question;       
    }
(...)
      var textobject1 = new textObject(typedquestion);

在问题获胜后添加__type工作。另外,即使没有名称空间,您也需要添加&#34;:#&#34;在它之后。模式如下:&#34; datacontractname:#datacontractnamespace&#34;。 我发现它以编程方式在我的TextObject上创建序列化器,以便我可以找到所需的格式。然后我的webmethod收到的formelement是TextObject的类型!任务完成 ! 谢谢大家!