Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 是否将用户定义的类定义为DataContract_Jquery_Ajax_Wcf - Fatal编程技术网

Jquery 是否将用户定义的类定义为DataContract

Jquery 是否将用户定义的类定义为DataContract,jquery,ajax,wcf,Jquery,Ajax,Wcf,我想使用一个AJAX调用使用WCF REST服务 假设我有以下内容,Person是一个用户定义的类: [ServiceContract] public interface IPerson { [WebInvoke(ResponseFormat = WebMessageFormat.Json)] [OperationContract] Person GetPerson(); } 将人员定义为数据合同与我未将人员定义为数据合同之间有什么区别 [DataContract

我想使用一个AJAX调用使用WCF REST服务

假设我有以下内容,
Person
是一个用户定义的类:

[ServiceContract]
public interface IPerson
{
    [WebInvoke(ResponseFormat = WebMessageFormat.Json)]   
    [OperationContract]
    Person GetPerson();
}
人员
定义为
数据合同
与我未将
人员
定义为
数据合同
之间有什么区别

[DataContract]
public class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}
在客户端,无论
Person
是否定义为
DataContract
,我都可以使用以下内容,对吗

<script type="text/javascript">
    $().ready(function() {
        $("#Button1").click(function() {
            $.getJSON("<url of the service>/GetPerson", CallBackMethod);
        });
    });

    function CallBackMethod(result) {
        alert(result.FirstName);
        alert(result.LastName);
    }
</script>

$().ready(函数()){
$(“#按钮1”)。单击(函数(){
$.getJSON(“/GetPerson”,CallBackMethod);
});
});
函数回调方法(结果){
警报(result.FirstName);
警报(result.LastName);
}

数据契约只是.NET Framework支持的一种序列化形式;它们本质上是WCF之前XML序列化的替代品。这一切都是通过DataContractSerializer完成的,DataContractSerializer负责将对象转换为与数据契约匹配的序列化XML。这是WCF和ASP.NET JSON代码以及其他pleaces使用的序列化程序类

理论上,您应该使用DataContract和DataMember属性标记合同对象,以明确它们的用途。实际上,DataContractSerializer将根据您提供的任何自定义类型生成数据协定;如果您不使用DataContract和DataMember属性,它将为您推断出它们。添加它们可以让您更好地控制序列化的工作方式,与添加XML序列化属性的方式完全相同。由于缺少显式属性,对象中的所有公共字段都成为数据协定的一部分


所以,您的问题的真正答案是,至少就序列化程序而言,Person始终被定义为DataContract;向类及其所有公共成员添加属性将产生相同的效果。在我看来,没有理由不这样做:它会花费你几毫秒的键入时间,如果你不这样做,运行时就会假装你做了。

首先,在某些情况下,一个类型可能会实现多个编程模型。例如,它可以是DataContract和IXmlSerializable,也可以是CollectionDataContract和IXmlSerializable。数据契约编程模型——它不仅仅是DataContractAttribute——规定了这些类型应该如何序列化。有关如何工作的详细信息,请参阅

为了回答您的具体问题,在.NET3.5SP1之前,您无法序列化“POCO”类型(普通的旧C#类型),除非它们用DataContractAttribute修饰。然而,一旦引入了POCO支持,就没有什么不同了。有关详细信息,请参阅

希望这有帮助