WCF学习 (四) 数据契约的事件

本文介绍了如何在WCF中利用序列化与反序列化事件来控制数据契约中的数据,包括如何监听序列化前、序列化后、反序列化前、反序列化后的事件,以及如何通过特定的属性标识方法来实现这一功能。以一个具体的数据契约实例展示了如何在反序列化后设置非数据成员的值。

技术准备:

     1.dotnet基本开发;

     2.WCF的数据契约跟服务契约的基本使用

内容:

     我们都知道数据契约其实也是服务器端到客户端序列化跟反序列化,这样的序列化跟asp.net ajax访问webservice是很像的.asp.net ajax 一般是将服务器端的数据序列化成jason字符串传递给前台脚本的但是我们在序列化或则反序列化的时候也许会要去控制一些数据契约里面的Filed或则Attributes,这就需要我们去监听数据契约在序列化及反序列化时触发的一些事件。

 

数据契约的事件

     数据契约在序列化跟反序列化分别有四个事件:

               1.serializing事件:发生在序列化之前;

               2.serialized事件:发生在序列化之后;

               3.deserializing事件:反序列化之前;

               4.deserialized事件:反序列化之后;

     四个事件我们一眼就能看得懂。但是我们如何去监听这几个事件呢,WCF提供了四个属性标识来标识我们定义的某个方法是来监听标识的特定的事件。但是我们在定义方法的时候必须要去符合这些事件的委托的类型,也就是说必须有相同的参数。我们看下定义的形式:

               1.监听serializing事件:

                    [OnSerializing]

                    void OnSerializing(StreamingContext context)

               2.监听serialized事件:

                    [OnSerialized]

                    void OnSerialized(StreamingContext context)

               3.监听deserializing事件:

                    [OnDeserializing]

                    void OnDeserializing(StreamingContext context)

               4.监听deserialized事件:

                    [OnDeserialized]

                    void OnDeserialized(StreamingContext context)

所以我们可以看出我们定义的方法一定要符合 void <methdName>(StringmingContext <Pram>)的形式,不然WCF就会抛出异常。要注意的一点就是:我们不能把相同的事件的标识应用到多个方法上面。

     因为在反序列化的时候是没有构造函数被调用的,所以我们可以通过OnDeserializing来实现反序列化的构造函数的功能。OnDeserialized事件允许初始化数据契约或则非数据契约的成员。下面我们就看一个例子通过监听OnDeserialized来设置非数据成员的值。

首先我们来定义一个数据契约:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace DataContract
{
    [DataContract(Name
="Employee",Namespace="HenllyeeData")]
    
public class EmployeeEntry
    {
        
#region Fields
        
private string _companyName;
        
private string _name;
        
private int _age;
        
private decimal _salary;
        
#endregion

        
#region Attributes
        [DataMember(IsRequired
=false,Order=0)]
        
public string Name
        {
            
get { return this._name; }
            
set { this._name = value; }
        }

        [DataMember(IsRequired
=false,Order=1)]
        
public int Age
        {
            
get { return this._age; }
            
set { this._age = value; }
        }
        [DataMember(IsRequired
=false,Order=2)]
        
public decimal Salary
        {
            
get { return this._salary; }
            
set { this._salary = value; }
        }
        [DataMember(IsRequired
=false,Order=3)]
        
public string Info
        {
            
get
            {
                
return String.Format("Name:{0} \n Age:{1} \n; Salary:{2}\n CompanyName:{3}\n",
                    
this._name,
                    
this._age,
                    
this._salary,
                    
this._companyName);
            }
            
set
            {
            }
        }

        [OnDeserialized]
        
void OnDeserialized(StreamingContext context)
        {
            
this._companyName = "ECI";
        }
        
#endregion
    }
}

 

在这里面我们定义了一个_companyName字段,并且不表示为DataMember,但是在Info属性中去获取了_companyName的值。我们在反序列化的时候完后通过OnDeserizlized方法中设计了其值。

 

下面是服务契约:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ServiceContract
{

    [ServiceContract(Name
="EmployeeManagerService")]
    
public interface IEmployeeManager
    {
        
/// <summary>
        
/// Get a employee object
        
/// </summary>
        
/// <returns></returns>
        [OperationContract(Name="GetEmployee")]
        DataContract.EmployeeEntry GetEmployee();
        
        
/// <summary>
        
/// Save a employee object
        
/// </summary>
        
/// <param name="?"></param>
        [OperationContract(Name="SaveEmployee")]
        
void SaveEmplyee(DataContract.EmployeeEntry employee);

    }
}

 

服务契约的实现:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace ServiceContract
{
    [ServiceBehavior(InstanceContextMode
=InstanceContextMode.Single)]
    
public class EmployeeManager:IEmployeeManager
    {
        
#region Fields
        
private DataContract.EmployeeEntry _employee;
        
#endregion

        
#region Methods
        
public DataContract.EmployeeEntry GetEmployee()
        {
            
return this._employee;
        }

        
public void SaveEmplyee(DataContract.EmployeeEntry EmloyeeEntry)
        {
            
this._employee = EmloyeeEntry;
        }
        
#endregion
    }
}

 

宿主主机的代码比较简单就是暴露了一个终节点给客户端。

我们看下客户端的代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    
class Program
    {
        
static void Main(string[] args)
        {
            EmployeeServiceReference.Employee emloyee 
= new ConsoleApplication1.EmployeeServiceReference.Employee();
            emloyee.Name 
= "Henllyee";
            emloyee.Age 
= 22;
            emloyee.Salary 
= 3000;
            EmployeeServiceReference.EmployeeManagerServiceClient proxy 
= new ConsoleApplication1.EmployeeServiceReference.EmployeeManagerServiceClient();
            proxy.SaveEmployee(emloyee);

            EmployeeServiceReference.Employee emploOut
= proxy.GetEmployee();
            Console.Write(emploOut.Info);
            Console.Read();
            
        }
    }
}

 

 运行主机跟客户端后我们看到了想要的效果:

 

 

[代码下载] 

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。

转载于:https://www.cnblogs.com/Henllyee/archive/2008/08/05/1261107.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值