WCF 第二章 契约 数据契约版本

本文讨论了软件变更中数据契约版本控制的重要性,特别是如何通过添加或删除非必需数据成员来保持向后兼容性,并介绍了间断与不间断变化的概念及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变化是不可避免的。企业改变,技术改变,法律改变,软件契约也会改变。在面对软件的变更时,一个坚实的版本控制是必须的。我们必须为不可避免的变化做好提前准备同时对已经存在的客户端进行向后兼容处理。
  对数据契约版本控制来说,最常见的需求是向已有的数据契约中添加成员。通过这一部分的描述,你可以做任何改动而不会破坏现有客户端。但是如果你需要打破现有客户端的向后兼容性,你必须通过改变数据契约的名字或者命名空间来定义另一个版本的数据契约。
  一个小的注意是要注意不间断的变化。不间断,从WCF的标准来看,可能会打破与其他系统的兼容性。例如,如果与一个要求元数据验证的系统通信,系统可能会拒绝消息如果接收到的XML实例中有不可预期的元素。这一章中提到的不间断周期是指那些不会影响WCF到WCF通信的改变。
 
不间断改变
两种类型的改变将不会打破现有客户端的兼容性
  1. 添加新的非必须数据成员
  2. 移除现有的非必须的数据成员
在这两种情况中,可以通过简单的忽略新增的或遗失的非必须数据元素来从新消息中创建一个原有的类型。相反的,也可以从原有类型中创建新消息。DataContractSerializer将会在运行时自动处理这些。
 
间断的改变
尽管你可以在数据契约中改变特定的水洗那个而且保证向后兼容性,非常多的元素改变将影响现有的客户端。如果你对一个数据契约定义做了以下改动中的任何一种,当前的客户端将不再会继续正常工作。
  1. 改变一个数据契约的名字或命名空间
  2. 对先前是必须的数据成员进行重命名操作
  3. 添加一个新的数据成员而且它的名字与之前用过的一样
  4. 改变一个已经存在的数据成员的数据类型
  5. 在DataMemberAttribute上添加IsRequired=true的新成员
  6. 在DataMemberAttribute上移除IsRequired=true的新成员
 
列表2.24 显示了两种数据契约定义: 第一个定义在服务V1中,第二个定义在V1服务的另一个版本V2中。注意V1和V2的区别,数据成员Currency被移除同时DailyVolume被添加进来。这个改变时不间断的。
 
列表2.24 一个数据契约的不间断改变-添加并且删除数据成员
[DataContract(Namespace="http://EssentialWCF")]
publicclass StockPrice //V1
{
[DataMember]
publicdouble CurrentPrice;
[DataMember]
public DateTime CurrentTime;
[DataMember]
publicstring Ticker;
[DataMember]
publicstring Currency;
}

[DataContract(Namespace
="http://EssentialWCF")]
publicclass StockPrice //V2
{
[DataMember]
publicdouble CurrentPrice;
[DataMember]
public DateTime CurrentTime;
[DataMember]
publicstring Ticker;
[DataMember]
publicint DailyVolume;
}
对现有的客户端来说,想要在新数据成员添加进来以后仍然进行正常的数据传输,原始数据契约必须支持扩展性。就是说,原始数据契约必须支持对将来的未知的数据的序列化。这就实现了回转,一个客户端可以把V2的数据发送给V1,然后把V1再重新发回给V2。WCF默认通过由svcutil.exe 生成的代理代码实现扩展性。如果你不想支持这个特性,它可以通过在服务配置文件中的ServiceBehavior部分加上<dataContractSerializer ignoreExtensionDataObject=”true”/>来禁用。
 
列表2.25显示了调用GetPrice来获取一个StockPrice对象并把这个对象发送给StoreStockPrice的客户端代码。假设通过svcutil.exe生成的StockService的代理指向V1服务,然后这个服务被更新为列表2.24中的V2服务。当客户端运行V2服务时,GetPrice方法将会放回有DailyVolume成员被添加同时Currency对象被移除的XML。数据契约反序列化器知道V1 StockPrice对象,会把DailyVolume成员放到V1对象的ExtensionData成员中而且不会提示丢失Currency成员。客户端代码将会接受预期的StockPrice对象,仅会发现Currency被初始化为默认值而且总体对象将会有点”重”。这是因为额外的扩展数据(DailyVolume)在类中可见。这种方式下,服务发送合法的V2数据同时客户端使用由哪些数据组成的合法的V1服务。
 
列表2.25 使用一个V1契约调用一个V2服务
localhost.StockServiceClient proxy =new localhost.StockServiceClient();
localhost.StockPrice s
= proxy.GetPrice("msft");
proxy.StoreStockPrice(s);
 
内容概要:本文介绍了基于SMA-BP黏菌优化算法优化反向传播神经网络(BP)进行多变量回归预测的项目实例。项目旨在通过SMA优化BP神经网络的权重和阈值,解决BP神经网络易陷入局部最优、收敛速度慢及参数调优困难等问题。SMA算法模拟黏菌寻找食物的行为,具备优秀的全局搜索能力,能有效提高模型的预测准确性和训练效率。项目涵盖了数据预处理、模型设计、算法实现、性能验证等环节,适用于多变量非线性数据的建模和预测。; 适合人群:具备一定机器学习基础,特别是对神经网络和优化算法有一定了解的研发人员、数据科学家和研究人员。; 使用场景及目标:① 提升多变量回归模型的预测准确性,特别是在工业过程控制、金融风险管理等领域;② 加速神经网络训练过程,减少迭代次数和训练时间;③ 提高模型的稳定性和泛化能力,确保模型在不同数据集上均能保持良好表现;④ 推动智能优化算法与深度学习的融合创新,促进多领域复杂数据分析能力的提升。; 其他说明:项目采用Python实现,包含详细的代码示例和注释,便于理解和二次开发。模型架构由数据预处理模块、基于SMA优化的BP神经网络训练模块以及模型预测与评估模块组成,各模块接口清晰,便于扩展和维护。此外,项目还提供了多种评价指标和可视化分析方法,确保实验结果科学可信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值