WCF分布式开发步步为赢(7):WCF数据契约与序列化
[2] 序列化基本概念
[3] .NET 序列化机制
[4] 代码实现与分析
【4】代码实现与分析:
下面是示例代码的具体实现过程,这里做简要的讲解.
【4.1】数据契约:
我们定义了一个数据契约类UserDataContract,包含简单的几个属性Name、Email、Mobile,分别用来存储用户名、电子邮件、手机信息,代码如下:
class UserDataContract
{
[DataMember(Name = "UserName")]//数据成员标记,支持别名定义
public string Name
{
get;set;
}
[DataMember(Name = "UserEmail")]//数据成员标记,支持别名定义
public string Email
{
get;set;
}
[DataMember]//数据成员标记
public string Mobile
{
get;set;
}
//没有[DataMember]声明,不会被序列化
public string Address
{
get; set;
}
}
【4.2】服务契约:
服务契约我们定义里连个操作AddNewUser(UserDataContract user)和UserDataContract GetUserByName(string name);分别为了测试数据契约的序列化和传递特性,服务类里给出了简单的实现,实际项目应用过程中,我们可以访问数据库进行数据持久化操作,或者调用封装其他的业务逻辑。代码如下:
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契约
[OperationContract]
bool AddNewUser(UserDataContract user);
//操作契约
[OperationContract]
UserDataContract GetUserByName(string name);
}
//2.服务类,继承接口。实现契约
public class WCFService : IWCFService
{
//实现接口定义的方法
public bool AddNewUser(UserDataContract user)
{
//这里可以定义数据持久化操作,访问数据库等
//不给出具体代码
Console.WriteLine("Hello! ,This an DataContract demo for WCF Service ");
return true;
}
//实现接口定义的方法
public UserDataContract GetUserByName(string name)
{
UserDataContract userDataContract = new UserDataContract();
userDataContract.Address = "ShangHai China";
userDataContract.Email = "frank_xl@163.com";
userDataContract.Name = "Frank Xu Lei";
Console.WriteLine("Hello! {0},This an overloading demo WCF Service ", name);
return userDataContract;
}
}
【4.3】客户端:
托管宿主的配置前面已经介绍过具体的配置过程,这里不再详述。客户端添加服务引用,反序列化生成的客户端数据契约代码如下:
我们可以看到客户端数据契约的属性都添加了[System.Runtime.Serialization.DataMemberAttribute()]标记,并且我们在服务端数据契约使用别名属性客户端也做了相应的调整。并且生成了相应的私有数据成员字段。
客户端编写代码进行测试,分别测试增加客户端传递数据契约对象和从服务端返回数据契约对象,代码如下:
{
static void Main(string[] args)
{
//实例化客户端服务代理Tcp
WCFServiceClient wcfServiceProxy =
new WCFServiceClient("WCFDataContractFormatting.IWCFService");
Console.WriteLine("Test call service using TCP--------------------.");
//通过代理调用服务,分别传递不同的参数,进行测试
//实例化数据契约对象,设置信息
UserDataContract userDataContract = new UserDataContract();
userDataContract.UserName = "WCF Client: Frank Xu Lei";
userDataContract.UserEmail = "WCF Client: frank_xl@163.com ";
userDataContract.Mobile = "WCF Client:1666666666";
//调用代理服务,增加用户操作:
wcfServiceProxy.AddNewUser(userDataContract);
//查询用户信息:
string name = "WCF Client: Frank Xu";
UserDataContract userData = wcfServiceProxy.GetUserByName(name);
if (userData != null)
{
Console.WriteLine(userData.UserName);
Console.WriteLine(userData.UserEmail);
Console.WriteLine(userData.Mobile);
}
//Debuging
Console.WriteLine("Press any key to continue");
Console.Read();
}
}
}
显示结果正确,通过数据契约实现了客户端与WCF服务端的信息交互。如下图:
【5】总结
以上就是本节的全部内容。数据契约的设计和使用在WCF面向服务的分布式应用系统开发中有重要的意义。全文首先介绍了数据契约的基本概念,然后对现有的三种.NET 序列化机制进行了简单的介绍和对比,指出其相关特性。然后对WCF序列化机制做了详细介绍,WCF开发自己的面相服务的格式化器是因为现有的.NET 格式化器的功能上的局限性。最后给出了在WCF服务中使用数据契约进行服务操作的代码实现,并给出了相应的分析。最后是本文的示例代码供大家下载
/Files/frank_xl/WCFServiceDataContractFormattingFrankXuLei.rar .欢迎留言交流。