我想使用AJAX调用来使用WCF REST服务。
假设我有以下内容,其中Person
是用户定义的类:
[ServiceContract]
public interface IPerson
{
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Person GetPerson();
}
将
Person
定义为DataContract
和如果我未将Person
定义为DataContract
有什么区别?[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>
最佳答案
数据协定只是.NET Framework支持的序列化的一种形式。它们实质上是WCF之前的XML序列化的替代品。所有这些都通过DataContractSerializer完成,DataContractSerializer负责将您的对象转换为与数据协定匹配的序列化XML。这是WCF和ASP.NET JSON代码以及其他请求所使用的序列化程序类。
从理论上讲,您应该使用DataContract和DataMember属性标记合同对象,以明确它们的用途。实际上,DataContractSerializer会根据您提供的任何自定义类型创建数据合同;如果不使用它们,它将为您推断DataContract和DataMember属性。添加它们使您可以更好地控制序列化的工作方式,与添加XML序列化属性的方式完全相同。缺少显式属性,对象中的所有公共字段都将成为数据协定的一部分。
因此,对您问题的真正答案是,至少就序列化程序而言,始终将Person定义为DataContract;将属性添加到您的班级及其所有公共成员将产生相同的效果。 IMO,没有充分的理由不这样做:它花费了您数毫秒的输入时间,如果您不这样做,运行时只会假装您仍然这样做。