不需要 DataContract 和 DataMember

Posted

技术标签:

【中文标题】不需要 DataContract 和 DataMember【英文标题】:DataContract and DataMember not needed 【发布时间】:2016-11-04 21:35:36 【问题描述】:

请看下面的代码:

<head runat="server">
    <title></title>

    <script type="text/javascript"  src="Javascript/json2.js"></script>
    <script type="text/javascript" src="Javascript/jquery-1.11.1.min.js"></script>

    <script type = "text/javascript">


        Test();
        function Test() 
            alert("got here 1");
            $.ajax(
                type: "POST",
                url: "AjaxObjectTest.aspx/Test",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnSuccess(),
            async: false,
            failure: function (response) 
                alert('there was an error counting possibles')
            
        );

        function OnSuccess() 
            return function (response) 
                var data = response.d;
                alert(data.name);
            
        
    
    </script>

</head>

asp.net 代码如下所示:

Public Class Person
    Public id As Integer
    Public age As Integer
    Public name As String
End Class

Public Class AjaxObjectTest
    Inherits System.Web.UI.Page

    <System.Web.Services.WebMethod()> _
    Public Shared Function Test() As Person
        Dim p1 As Person = New Person
        p1.id = 1
        p1.age = 34
        p1.name = "Mark"
        Return p1
    End Function

End Class

请看这个链接:https://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx

我不必为 Person 类添加 DataMember 属性,也不必为属性添加 Data Contract 属性,即 Person.ID、Person.Age 和 Person.Name 以使其工作。

这是为什么?

【问题讨论】:

【参考方案1】:

DataContract 和 DataMember 是 WCF 服务上用于描述服务元数据的属性,在您的情况下,您没有使用实际的“Web 服务”,您只是公开了一个要作为 Web 服务使用和行为的方法。

请参阅以下主题以了解何时应该使用它们 DataContract 和 DataMember When to use DataContract and DataMember attributes?

【讨论】:

谢谢。这就是我的想法,但是我找不到任何文档来支持它。我假设 asmx Web 服务也不需要这些属性? +1 没错。只在 WCF 服务中使用,使其更加可控和灵活【参考方案2】:

来自您发送的链接 (https://msdn.microsoft.com/en-us/library/ms733127(v=vs.110).aspx):

默认情况下,DataContractSerializer 推断数据协定并序列化所有公开可见的类型。

您的字段可能是公开的……所以默认情况下,序列化程序会将它们放在响应中。为了选择序列化的字段,您必须在要忽略的字段上使用DataContractAttributeIgnoreDataMemberAttribute

【讨论】:

以上是关于不需要 DataContract 和 DataMember的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WPF 支持绑定到对象的属性,但不支持绑定字段?

不需要 DataContract 和 DataMember

InvalidDataContractException 是无效的集合类型,因为它具有 DataContractAttribute

DataContract 序列化异常(不需要数据合约名称)

DataContract XML 序列化和 XML 属性

如何在不破坏向后兼容性的情况下更改 DataContract 属性的类型?