第二章 数据契约

在一个服务内部,功能性的应用由代码实现的。在服务外部, 功能性服务在WSDL中定义。在一个WCF服务中,应用程序数据在简单和复杂类型表示;而在服务外部,应用程序数据由XML元数据定义表示。WCF数据契约提供了对代码定义的.NET CLR类型与W3C组织定义用来在服务外部通信的XML元数据定义之间的映射。

使用WCF,开发人员花费更多的时间在代码和接口语义上,在XSDWSDL语法上花费的时间会更少。那不是说XSDWSDL语法不重要;它们是跨平台系统上进行互操作必要前提。但是编译器也显示出了在把由.NET 语言生成的数据结构翻译为跨平台的具有互操作性的XSDWSDL表示的优势。

在设计阶段,[DataContract]属性用来表示哪个类应该以XSD形式表示而且被服务在WSDL中暴露。[DataMember]属性进一步定义XSD中哪一个类的成员应该包含在外部表示中。运行时,DataContractSerializer 类使用[DataContract][DataMember]规则把对象序列化成XML。图片2.7显示了将一个.NET实现用可以与其他系统实现互操作的XML元数据表示。

图片2.8也显示了在2.7中描述的同样翻译,同时为了区分也显示了C#和XSD的语法。

 

DataContractSerializer 讲序列化类型并在WSDL契约中暴露它们,如果它们满足以下条件:

标记[DataContract][DataMember]属性的类型

标记[CollectionDataContract]的类型

继承自IXmlSerializable 的类型

标记[Serializable]的类型,成员没有使用[NonSerializable]标记

标记[Serializable]的类型而且实现了ISerializable接口

内建CLR初始类型,比如int32string

Bytes数组, DataTime,TimeSpan,Guid,Uri,XmlQualifiedName,XmlElementXmlNode

数组和集合,比如List<T>, Dictionary<K,V>Hashtable

枚举

为一个.NET类定义XML元数据

[DataContract]属性,在System.Runtime.Serialization中定义,说明一个类应该在描述服务的WSDL中以XSD暴露出来。如果一个类没有[DataContract]属性,它将不会出现在WSDL中。默认的,XML元数据的名字与类的名字和元数据中的目标命名空间是一样的: http://schemas.datacontract.org/2004/07(.NET命名空间描述)。这两个都可以被重载。你可能想重载它们来控制在服务外部暴露的名字。比如,regOrder的一个内部类名可以在XSD中以Order暴露出来。列表2.16显示如果重载XSD的名字和命名空间。

[DataMember]属性,也定义在System.Runtime.Serialization, 确定将以[DataContract]属性定义的成员包含在XML元数据中。如果一个类的成员没有使用[DataMember]来定义属性,就不会包含在XML元数据中,尽管它是类的成员。默认的,类成员不包含在XML元数据定义中,这是一种选择模型。.NET类成员的范围,无论是公共的还是私有的,不影响它是否包含在XML元数据中; 决定是由[DataMember]来严格限定的。

  列表2.15演示了一个类定义,StockPrice,5哥公共数据成员。其中三个,ticker, theCurrentPricetheCurrentTime是必须的,因为它们使用isRequired=true标记。一些额外的[DataMember]特性在以下显示:

类成员名字在代码中都使用m_前缀。类成员名字被重载以便于m_notation不用引入服务接口定义的XSD中。

类成员的顺序由[DataMember]属性定义。如果顺序没有确定,元素将会在XSD中按字母顺序排列。顺序一般是不重要的,但是控制顺序对互操作来说很重要。如果你在发送消息给一个期待在特定方式接收顺序消息的服务,这个属性可以控制编码到XML文本中的元素顺序。

类成员m_CurrentPrice, m_CurrentTypem_ticker标记为必须的,但是m_dailyVolumem_dailyChange不是。非必须存在的类成员可以在XML实例中被忽略而且根据XSD它们仍然被认为是合法的。

Svcutil.exe –t:metadata 命令使用类中定义的[DataMember]元素生成XSD。列表2.16显示了列表2.15中的代码生成的XSD。注意元素名和顺序是根据代码中属性定义的。同时也要注意非必须类成员在XML元数据中定义成minOccurs=0.

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值