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
因為在反序列化的時候是沒有建構函式被呼叫的,所以我們可以通過OnDeserializing來實現反序列化的建構函式的功能。OnDeserialized事件允許初始化資料契約或則非資料契約的成員。下面我們就看一個例子通過監聽OnDeserialized來設定非資料成員的值。
首先我們來定義一個資料契約:
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方法中設計了其值。
下面是服務契約:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace ServiceContract
{
[ServiceContract(Name="EmployeeManagerService")]
public interface IEmployeeManager
{
///
/// Get a employee object
///
///
[OperationContract(Name="GetEmployee")]
DataContract.EmployeeEntry GetEmployee();
///
/// Save a employee object
///
///
[OperationContract(Name="SaveEmployee")]
void SaveEmplyee(DataContract.EmployeeEntry employee);
}
}
服務契約的實現:
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
}
}
宿主主機的程式碼比較簡單就是暴露了一個終節點給客戶端。
我們看下客戶端的程式碼:
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();
}
}
}
執行主機跟客戶端後我們看到了想要的效果:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-600251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WCF學習(三):資料契約序列化
- Programming WCF Services:資料契約版本控制
- 事件、契約設計與BDD事件
- WCF技術剖析之十五:資料契約代理(DataContractSurrogate)在序列化中的作用
- WCF技術剖析之十八:訊息契約(Message Contract)和基於訊息契約的序列化
- WCF學習筆記(一):WCF簡介筆記
- 學習 WCF (3)--開發WCF客戶程式
- 大資料學習筆記(四)大資料筆記
- wcf學習總結《中》
- WCF分散式開發步步為贏(0):WCF學習經驗分享,如何更好地學習WCF?薦分散式
- 我的MYSQL學習心得(四)資料型別MySql資料型別
- 學習WCF之路,長期更新
- 資料庫學習(四)連線查詢資料庫
- iOS學習資源(四)iOS
- Constract 契約自定義
- 碎片化學習Java(四)-- Java資料型別Java資料型別
- 簽約獎金:IT世界的賣身契
- 暑期自學 Day 11 | 資料庫 (四)- 約束資料庫
- 契約測試Pact實踐
- SpringMVC 學習筆記(四) 處理模型資料SpringMVC筆記模型
- 資料庫學習筆記(四)2017.9.19資料庫筆記
- 大資料學習四:網路相關知識大資料
- 博弈學習 (二) 斐波那契博弈
- Solidity語言學習筆記————44、合約的後設資料Solid筆記
- 自己整理的學習資料——DB2 V8資料庫基礎(四)DB2資料庫
- Docker學習總結(四)——容器間的通訊和資料卷Docker
- Django學習(四)表單,讓資料庫更強大Django資料庫
- 學習資料
- Go學習【二】學習資料Go
- 大資料學習資料大資料
- 《學習》6約束
- 深度學習(一)深度學習學習資料深度學習
- Dubbo中的統一契約是如何實現的?
- 學習大資料需要掌握的知識,需要學習的資料技術大資料
- Android官方培訓課程學習(四): 資料儲存Android
- 大資料框架之一——Hadoop學習第四天大資料框架Hadoop
- 想學習大資料?這才是完整的大資料學習體系大資料
- Python資料科學(四) 資料收集系列Python資料科學