gpt4 book ai didi

jquery - 是否将用户定义的类定义为 DataContract

转载 作者:行者123 更新时间:2023-12-01 08:17:53 24 4
gpt4 key购买 nike

我想使用 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 完成的,它负责将对象转换为与数据协定匹配的序列化 XML。这是 WCF 和 ASP.NET JSON 代码等使用的序列化器类。

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

因此,您问题的真正答案是,Person始终被定义为 DataContract,至少就序列化器而言是如此;将属性添加到您的类及其所有公共(public)成员中将产生相同的效果。 IMO,没有充分的理由这样做:这会花费你几毫秒的打字时间,如果你不这样做,运行时就会假装你已经这样做了。

关于jquery - 是否将用户定义的类定义为 DataContract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com