何时使用DataContract和DataMember属性?
我很关心WCF中的DataContract
属性。 据我所知,它被用于类似类的用户定义types的序列化。 我写了一个这样暴露在客户端的类。
[DataContract] public class Contact { [DataMember] public int Roll { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Address { get; set; } [DataMember] public int Age { get; set; } }
它正常工作,但是当我删除DataContract
和DataMember
它也能正常工作。 我不明白为什么它正常工作。 任何人都可以告诉我DataContract
的实际用途是什么?
我的服务合同是这样的
[ServiceContract] public interface IRestServiceImpl { [OperationContract] Contact XmlData(string id); }
由于许多程序员被.NET 3.5 SP1中的[DataContract]
和[DataMember]
属性所淹没,Microsoft使得数据协定序列化程序处理所有类 – 即使没有这些属性 – 就像旧的XML序列化程序一样。
因此从.NET 3.5 SP1开始,您不必再添加数据合约或数据成员属性 – 如果您不这样做,那么数据协定序列化程序就会像您的XML序列化程序那样序列化您的类上的所有公共属性。
然而,通过不添加这些属性,你会失去很多有用的function:
- 没有
[DataContract]
,你不能为你的数据定义一个XML命名空间 - 如果没有
[DataMember]
,则无法序列化非公共属性或字段 - 如果没有
[DataMember]
,则无法定义序列化顺序(Order=
),DCS将按字母顺序排列所有属性 - 如果没有
[DataMember]
,则无法为属性定义不同的名称(Name=
) - 没有
[DataMember]
,你不能定义IsRequired=
或其他有用的属性 - 如果没有
[DataMember]
,则不能遗漏某些公共属性 – 所有公共属性都将由DCS序列化
所以对于一个“quick'n'dirty”解决scheme来说,将[DataContract]
和[DataMember]
属性放在[DataMember]
就行不通 – 但把它们放在你的数据类上还是一个好主意 – 只是为了更清楚地知道你是什么做,并让自己获得所有那些你没有得到的附加function。
就WCF而言,我们可以通过消息与服务器和客户端进行通信。 为了传递信息,从安全的angular度来看,我们需要以一种序列化的格式制作一个数据/信息。
为了序列化数据,我们使用[datacontract]和[datamember]属性。 在你的情况下,如果你使用datacontract
WCF使用DataContractSerializer
否则WCF使用默认序列化技术的XmlSerializer
。
让我详细解释一下:
基本上WCF支持3种序列化:
- XmlSerializer的
- DataContractSerializer的
- NetDataContractSerializer
XmlSerializer : – 默认顺序和class相同
DataContractSerializer / NetDataContractSerializer : – 默认顺序是按字母顺序
XmlSerializer :XML模式是广泛的
DataContractSerializer / NetDataContractSerializer : – XML模式受到约束
XmlSerializer : – 版本支持不可能
DataContractSerializer / NetDataContractSerializer : – 版本支持是可能的
XmlSerializer :与ASMX兼容
DataContractSerializer / NetDataContractSerializer :与.NET Remoting的兼容性
XmlSerializer : – 属性在XmlSerializer中不是必需的
DataContractSerializer / NetDataContractSerializer : – 此序列化中所需的属性
所以你用什么取决于你的要求…
数据合同是服务和客户之间的正式协议,抽象地描述要交换的数据。 也就是说,要进行交stream,客户和服务不必共享相同的types,只有相同的数据合同。 数据契约为每个参数或返回types精确地定义了什么数据被序列化(变成XML)以便交换。
Windows Communication Foundation(WCF)默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将其转换为XML)。 所有.NET Framework基元types(如整数和string)以及被视为基元的某些types(如DateTime和XmlElement)都可以进行序列化,而无需其他准备工作,并被视为具有默认数据协定。 许多.NET Frameworktypes也有现有的数据合同。
你可以在这里find完整的文章。
另外,当你从http请求调用它将正常工作,但是当你尝试从net.tcp调用那个时候你得到所有这种东西
DataMember属性不是强制添加到序列化数据。 未添加DataMember属性时,旧的XMLSerializer将序列化数据。 添加DataMember提供了有用的属性,如order,name,isrequired,否则不能使用。
数据合同是服务和客户之间的正式协议,抽象地描述要交换的数据。
数据契约可以是明示的也可以是隐含的。 简单types如int,string等有一个隐含的数据契约。 用户定义的对象是显式的或复杂的types,您必须使用[DataContract]和[DataMember]属性为其定义数据协定。
数据合同可以定义如下:
-
它描述了传入和传出服务操作的数据的外部格式
-
它定义了在服务消息中交换的数据的结构和types
- 它将CLRtypes映射到XML模式
- 它定义了数据types是如何序列化和反序列化的。 通过串行化,将对象转换为可以通过networking传输的字节序列。 通过反序列化,您可以从调用应用程序接收到的一系列字节中重组对象。
- 这是一个版本控制系统,允许您pipe理对结构化数据的更改
我们需要将System.Runtime.Serialization引用包含到项目中。 该程序集包含DataContract和DataMember属性。