我对WCF中的 DataContract
属性非常困惑 . 据我所知,它用于序列化类似用户定义的类型 . 我写了一个在这样的客户端公开的类 .
[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
的实际用途是什么?
我的服务 Contract 是这样的
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
Contact XmlData(string id);
}
7 回答
由于许多程序员都被_845754_和
[DataMember]
属性所淹没,使用.NET 3.5 SP1,Microsoft使数据 Contract 序列化程序处理所有类 - 即使没有任何这些属性 - 就像旧的XML序列化程序一样 .因此,从.NET 3.5 SP1开始,您不再添加数据协定或数据成员属性 - 如果不这样做,那么数据协定序列化程序将序列化类上的所有公共属性,就像XML序列化程序一样 .
HOWEVER: 通过不添加这些属性,您将失去许多有用的功能:
没有
[DataContract]
,您无法为您的数据定义XML命名空间没有
[DataMember]
,您无法序列化非公共属性或字段没有
[DataMember]
,您无法定义序列化顺序(Order=
),DCS将按字母顺序序列化所有属性没有
[DataMember]
,您无法为您的属性定义其他名称(Name=
)没有
[DataMember]
,您无法定义IsRequired=
之类的内容或其他有用的属性没有
[DataMember]
,您不能遗漏某些公共 property - 所有公共 property 将由DCS序列化因此,对于一个"quick'n'dirty"解决方案,忘掉
[DataContract]
和[DataMember]
属性将会起作用 - 但它仍然在做,并且让自己可以访问除了它们之外没有得到的所有其他功能......就WCF而言,我们可以通过消息与服务器和客户端进行通信 . 为了传输消息,从安全角度来看,我们需要以序列化格式制作数据/消息 .
For serializing data we use [datacontract] and [datamember] attributes. 在您的情况下如果您使用
datacontract
WCF使用DataContractSerializer
否则WCF使用XmlSerializer
这是默认的序列化技术 .让我详细解释一下:
基本上WCF支持3种类型的序列化:
XmlSerializer
DataContractSerializer
NetDataContractSerializer
XmlSerializer : - 默认顺序与类相同
DataContractSerializer/NetDataContractSerializer : - 默认顺序为按字母顺序排列
XmlSerializer : - XML Schema非常广泛
DataContractSerializer/NetDataContractSerializer : - XML Schema受到约束
XmlSerializer : - 无法进行版本控制支持
DataContractSerializer/NetDataContractSerializer : - 可以支持版本控制
XmlSerializer : - 与ASMX的兼容性
DataContractSerializer/NetDataContractSerializer : - 与.NET Remoting的兼容性
XmlSerializer : - XmlSerializer中不需要属性
DataContractSerializer/NetDataContractSerializer : - 此序列化所需的属性
所以你使用的东西取决于你的要求......
数据协定是服务和客户之间的正式协议,它抽象地描述要交换的数据 . 也就是说,为了进行通信,客户端和服务不必共享相同的类型,只需要相同的数据 Contract . 对于每个参数或返回类型,数据协定精确定义了要交换的序列化(转换为XML)的数据 .
Windows Communication Foundation(WCF)默认使用名为Data Contract Serializer的序列化引擎来序列化和反序列化数据(将数据转换为XML或从XML转换) . 所有.NET Framework原语类型(如整数和字符串)以及某些类型(如DateTime和XmlElement)都可以序列化,无需其他准备工作,并被视为具有默认数据协定 . 许多.NET Framework类型也有现有的数据协定 .
你可以找到完整的文章here.
数据协定是服务和客户之间的正式协议,它抽象地描述要交换的数据 .
数据 Contract 可以是明确的或隐含的 . 简单类型(如int,string等)具有隐式数据协定 . 用户定义的对象是显式或复杂类型,您必须使用[DataContract]和[DataMember]属性定义数据协定 .
数据 Contract 可以定义如下:
它描述了传入和传出服务操作的数据的外部格式
它定义了服务消息中交换的数据的结构和类型
它将CLR类型映射到XML架构
它定义了数据类型的序列化和反序列化方式 . 通过序列化,您可以将对象转换为可以通过网络传输的字节序列 . 通过反序列化,您可以从调用应用程序接收的字节序列中重新组合对象 .
这是一个版本控制系统,允许您管理对结构化数据的更改
我们需要包含对项目的System.Runtime.Serialization引用 . 这个程序集包含DataContract和DataMember属性 .
数据协定:它指定您的实体类已准备好进行序列化过程 .
数据成员:它指定特定字段是数据协定的一部分,并且可以序列化 .
此外,当你从http请求调用它将正常工作,但当你尝试从net.tcp调用时,你得到所有这些东西
DataMember属性不是必须添加到序列化数据 . 未添加DataMember属性时,旧的XMLSerializer会序列化数据 . 添加DataMember提供了有用的属性,如order,name,isrequired,否则无法使用 .