1、基础

          在设计阶段,[DataContract]属性用来表示哪个类应该以XSD形式表示而且被服务在WSDL中暴露。[DataMember]属性进一步定义XSD中哪一个类的成员应该包含在外部表示中。运行时,DataContractSerializer 类使用[DataContract]和[DataMember]规则把对象序列化成XML。

WCF的数据契约提供了一种功能,在.NET的CLR类型与W3C组织定义的XSD之间,以及代码内部定义与服务外部通信之间,进行数据的映射。

数据契约_子类

2、类的层次结构

     WCF支持在WSDL中表示类的层次结构,可以在类结构和XML间进行序列化和反序列化,并将各个类的属性保留下来

namespace Stock
{
[DataContract(Namespace = "http://EssentialWCF/Price/")]
public class Price
{
[DataMember]
public double CurrentPrice;
[DataMember]
public DateTime CurrentTime;
[DataMember]
public string Currency;
}

[DataContract(Namespace = "http://EssentialWCF/StockPrice")]
public class StockPrice : Price
{
[DataMember]
public string Ticker;
[DataMember]
public long DailyVolume;
[DataMember]
public double DailyChange;
}
}


​​数据契约_序列化_02​​



3、用KnownType属性子WSDL中发布其他数据类型

      A、一个序列化的派生类被发送到端点,而端点则期望得到序列化的基类,WCF就无法知道反序列化这个类

      B、hashtable类,其中存储的元素都是其他的类

      如上情况,WCF必须被告知哪些类新药显示地包含在WSDL契约中,利用KnownType属性可以完成这一功能

[DataContract(Namespace="http://EssentialWCF/")]
[KnownType(typeof(StockPrice))]
[KnownType(typeof(MetalPrice))]
public class Price
{
[DataMember] public double CurrentPrice;
[DataMember] public DateTime CurrentTime;
[DataMember] public string Currency;
}

4、操作契约中定义knownType

定义了以后,可以调用服务器的方法的时候传递子类过去,WCF是认识的,否则,只能够传递已定义的父类过去
[ServiceKnownType(typeof(StockPrice))]
[ServiceKnownType(typeof(MetalPrice))]
[OperationContract]
private Price GetPrice(string id,string type)
{}

[OperationContract]
private void SetPrice(Price p)
{}

    如上,调用GetPrice方法的时候,可以任意返回子类,WCF都是识别的,但是调用SetPrice的时候,仅仅允许传递父类,传递子类为非法的

5、 暴露集合,[CollectionDataContract]