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; } }
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]