这一节我们来了解下WCF的数据契约我们知道在以往webservice的数据传输中如果传递复杂数据类型需要先进行数据序列化可以使用Serializable属性进行标记
来对复杂类型进行序列化但是使用Serializable进行序列化的时候是把整个类的所有属性和字段进行序列化实际使用过程中有些字段和属性我们是不需要进行序列化进行
传输的这样就增加了数据在传输过程中的开销使用这种方式缺少灵活性所以在WCF中我们可以使用DataContract对复杂类型进行序列化DataContract可以具体标记哪些字段需要进行序列化在通信过程中不需要使用的字段我们就不要进行序列化减少传输开销增加了灵活性
DataContract是在WCF中最常用的数据契约方式DataContract定义数据契约DataMember具体定义哪些成员需要进行序列化没有声明DataMember
特性的成员就不会进行序列化出现在XSD文件中我们看下面怎样定义数据契约
/// <summary>
/// 用户信息
/// </summary>
[DataContract]
public class User
{
/// <summary>
/// 用户ID
/// </summary>
[DataMember]
public string UserID
{ get; set; }
/// <summary>
/// 用户名
/// </summary>
[DataMember]
public string UserName
{
get;
set;
}
/// <summary>
/// 密码
/// </summary>
public string UserPwd
{
get;
set;
}
/// <summary>
/// 年龄
/// </summary>
[DataMember]
public int Age
{
get;
set;
}
public string Remark
{
get;
set;
}
}
定义完数据契约后我们定义一个服务契约客户端就可以通过该契约直接传输数据客户端添加该契约服务就可以看到该数据契约了
看如下实例
服务器端契约
// 注意 使用重构菜单上的重命名命令可以同时更改代码和配置文件中的接口名IService
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value)
[OperationContract]
User GetUserInfo(User user)
// TODO: 在此添加您的服务操作
}
public class Service : IService
{
public string GetData(int value)
{
return stringFormat(You entered: {} value)
}
List<User> list = new List<User>()
public Service()
{
listClear()
User user = new User()
userUserID = ;
userUserName = 下里巴人;
userUserPwd = ;
userAge = ;
userRemark = 帅哥;
listAdd(user)
User user = new User()
userUserID = ;
userUserName = Simple;
userUserPwd = ;
userAge = ;
userRemark = IT;
listAdd(user)
}
/// <summary>
/// 获取用户信息
/// </summary>
/// <param name=user></param>
/// <returns></returns>
public User GetUserInfo(User user)
{
User info=null;
for (int i = ; i < listCount; i++)
{
if (list[i]UserID==userUserID)
{
info=list[i];
break;
}
}
return info;
}
}
客户端调用
private void button_Click(object sender EventArgs e)
{
DataServiceServiceClient client = new DataServiceServiceClient()
DataServiceUser user = new DataServiceUser()
userUserID = ;
//返回用户信息
DataServiceUser userInfo=clientGetUserInfo(user)
if (userInfo == null)
{
MessageBoxShow(没找到该用户信息)
}
else
{
MessageBoxShow(姓名 + userInfoUserName + 年龄 + userInfoAgeToString())
}
}
效果图