数据契约

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]

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值