那些年,我们一起学WCF--(4)数据契约

     这一节我们来了解下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;
         }
    }


    定义完数据契约后,我们定义一个服务契约,客户端就可以通过该契约直接传输数据。客户端添加该契约服务,就可以看到该数据契约了。

    看如下实例

    服务器端契约

  // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IService1
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        User GetUserInfo(User user);
        // TODO: 在此添加您的服务操作
     

    }

 

  public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
        List<User> list = new List<User>();
        public Service1()
        {
            list.Clear();
            User user1 = new User();
            user1.UserID = "001";
            user1.UserName = "下里巴人";
            user1.UserPwd = "000";
            user1.Age = 25;
            user1.Remark = "帅哥";
            list.Add(user1);

            User user2 = new User();
            user2.UserID = "002";
            user2.UserName = "Simple";
            user2.UserPwd = "000";
            user2.Age = 30;
            user2.Remark = "IT";
            list.Add(user2);

        }

        /// <summary>
        /// 获取用户信息
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public User GetUserInfo(User user)
        {
            User info=null;
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].UserID==user.UserID)
                {
                   info=list[i];
                   break;
                }
            }
            return info;
        }

    }


客户端调用

   private void button1_Click(object sender, EventArgs e)
        {
            DataService.Service1Client client = new DataService.Service1Client();
            DataService.User user = new DataService.User();
            user.UserID = "001";

            //返回用户信息
            DataService.User userInfo=client.GetUserInfo(user);
            if (userInfo == null)
            {
                MessageBox.Show("没找到该用户信息");
            }
            else
            {
                MessageBox.Show("姓名:" + userInfo.UserName + ",年龄:" + userInfo.Age.ToString());
            }
        }

  效果图

          
   DEMO: http://download.csdn.net/detail/zx13525079024/4582901

 

 


 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值