【问题标题】:wcf deserializing : can we infer javascript type?wcf 反序列化:我们可以推断 javascript 类型吗?
【发布时间】:2011-12-19 13:58:09
【问题描述】:

我正在使用 JQuery 和 ajax 调用一个 asp.net 网络服务,使用 json 传输数据。 我正在创建将被 json 字符串化的 javascript 对象。我需要我的 web 方法来检索这些特定的对象类型,但我的参数类型是一个基类,并且这些对象从我的基类继承,如下所示:

[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 服务器能够反序列化我的数组中的正确类型。 但是一旦在我的 webmethod 中,“formobjects”都是 FormElement 类型,即使使用 serviceknowntype 属性,我也无法获得它们的真实类型。是因为 javascript 不是强类型,我无法检索具体类型吗?因为字符串化的 json 不会给出具体的类型? 我试过了

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

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

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

但是服务器端同样老旧,我的 webmethod 中只有 FormElement 类型,我无法转换。

也许我想做的事情是不可能的.. 还是谢谢你!!

【问题讨论】:

    标签: jquery asp.net wcf deserialization datacontract


    【解决方案1】:

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

    如果有办法根据您的 json 格式解决此问题,您可以编写自己的序列化程序来处理此方法的反序列化 - 请参阅 this MSDN blog post 了解如何为 WCF 编写自定义序列化程序。

    【讨论】:

    • 难道不能通过javascript给出类型信息吗?我尝试了 [DataContract(Name = "textObject")] 和 javascript 中的原型,但没有结果。
    • 不幸的是,不是 - 基于您上面的 JSON,您有一个具有属性 formobjects 的对象,即具有属性 textObject 的对象,即具有属性 question 的对象是一串值“test”。属性的名称不会与已知类型进行比较以确定它们是属性还是类型 - 它们只是属性。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      好吧,我找到了答案。就像rich.okelly 所说的那样,没有使用javascript 的弱类型语言发送类型信息,因为javascript 类不是.net 中的真实类。但微软预计,您需要使用他们所谓的“类型提示”,这意味着您将“__type”属性添加到您的 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 将不起作用。另外,即使没有命名空间,您也需要在其后添加“:#”。架构如下:“datacontractname:#datacontractnamespace”。 我发现它以编程方式在我的 TextObject 上创建序列化程序,以便我可以找到所需的格式。然后我的 webmethod 中收到的表单元素是 TextObject 的类型!任务完成 ! 谢谢大家!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多