数据协定最重要的当然就是DataContract和DataMember。这两个特性能应用到类、结构和枚举。这个两个特性跟服务契约的特点是一样的,只有被DataContract标记的类和类中被标记DataMember的属性、字段和事件才能被wcf的序列化引擎进行序列化和反序列化。

[DataContract]
    public class UserInfoModel
    {
        private int age;

        [DataMember]
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        private string name;

        [DataMember]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        [DataMember]
        private Gender gender;

        public Gender Gender
        {
            get { return gender; }
            set { gender = value; }
        }

    }

    [DataContract]
    public enum Gender
    {
        [EnumMember]
        Men = ,
        [EnumMember]
        women =
    }

这是我的一个简单的数据契约,在定义枚举的时候要用EnumMember,不然你会看到你的枚举会变成string类型。泛型类的处理方式与非泛型类的相同。

数据协定的命名空间NameSpace采用统一资源标识符(URI)的形式进行设置,数据协定的默认值与类名相同,可以通过Name属性重写,数据成员的Name属性的用法和数据协定的Name相同。

等效性:要使数据协定等效则命名空间和名称必须相同且数据成员的名称也必须相同,不然会引发异常。

数据成员的Order属性也会影响数据协定的等效性,数据成员的排序规则:基类成员->没有order属性的成员->order(如果order值相同则以成员的字母排序)。

DataMember的IsRequired标识该数据成员是否为必须,值为Bool型。

服务端:

[DataContract(Namespace = "www.wa3ha.com", Name = "People")]
    public class UserInfoModel
    {
        private int age;

        [DataMember(Order=)]
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        private string name;

        [DataMember(IsRequired=true)]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private Gender gender;

        [DataMember]
        public Gender Gender
        {
            get { return gender; }
            set { gender = value; }
        }

        private string nativePlace;

        [DataMember(Order=)]
        public string NativePlace
        {
            get { return nativePlace; }
            set { nativePlace = value; }
        }

    }

    [DataContract]
    public enum Gender
    {
        [EnumMember]
        Men = ,
        [EnumMember]
        women =
    }

客户端:

Svcutil.exe生成的代理:

还有一个比较重要的是KnownType,这个推荐看http://www.cnblogs.com/danielWise/archive/2011/06/23/2088464.html园子里的这位的博客!

数据协定版本重大变更:更改协定的Name或者NameSpace;更改DataMember的Order;将DataMember的IsRequired从false变更为true或删除IsRequired为true的成员;重命名数据成员;更改数据成员的数据协定。这些细想一下还是能理解为什么的,就不多说了。

将具有额外字段的类型反序列化为具有缺失字段的类型时,将忽略该字段,反之,额外字段将保留其默认值,0或者null。

WCF基础之数据协定的更多相关文章

  1. WCF基础之消息协定

    通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1.插入自定义soap标头:2.另一种是定义消息的头和正文的安全属性.消息协定通过MessageContra ...

  2. WCF初探-16:WCF数据协定之基础知识

    数据协定概念 “数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每一个做数 ...

  3. WCF学习心得------(六)数据协定

    --前言 最近各种事忙的把之前的WCF学习给耽误了一些,今天抽时间把之前的学习内容给总结了一下,因为知识点比较细碎没有做太多的练习示例,只是对其中关键的知识点做了总结,希望可以对大家有所帮助. 第六章 ...

  4. WCF初探-17:WCF数据协定之等效性

    数据协定等效性特点概述 对于客户端要将某种类型的数据成功发送到服务,或者服务要将数据成功发送到客户端的情况,接收端上并不一定必须存在此发送数据类型. 唯一的要求是两种类型的数据协定应该等效. 要使数据 ...

  5. WCF初探-18:WCF数据协定之KnownType

    KnownTypeAttribute 类概述 在数据到达接收终结点时,WCF 运行库尝试将数据反序列化为公共语言运行库 (CLR) 类型的实例.通过首先检查传入消息选择为反序列化而实例化的类型,以确定 ...

  6. 传说中的WCF(5):数据协定(a)

    在第4篇中,咱们了解了发送/接收SOAP头,从本篇开头,我们不妨更深入地去探求一下有关WCF中的消息到底是啥玩意儿.WCF庞大而复杂,而从 MSDN文档中,你会看到许多很专业很抽象的东西,你不禁会问, ...

  7. 传说中的WCF(6):数据协定(b)

    我们继续,上一回我们了解了数据协定的一部分内容,今天我们接着来做实验.好的,实验之前先说一句:实验有风险,写代码须谨慎. 实验开始!现在,我们定义两个带数据协定的类——Student和AddrInfo ...

  8. 我们一起学习WCF 第五篇数据协定和消息协定

    A:数据协定(“数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每个参数或 ...

  9. WCF基础

    初入职场,开始接触C#,开始接触WCF,那么从头开始学习吧,边学边补充. SOA Service-Oriented Architecture,面向服务架构,粗粒度.开放式.松耦合的服务结构,将应用程序 ...

随机推荐

  1. C#.NET为List加入扩展方法:获取唯一值

    public static class ListTools { /// <summary> /// 获取唯一值列表 /// </summary> /// <param n ...

  2. Node.js 替换文档内容

    server.js代码: var http=require('http'); var fs=require('fs'); var server=http.createServer(function(r ...

  3. 从git下载一个工程

    1.右键点工程区,选“Import...” 2.Import source 选Git->“Projects from Git” 3.三个选择项中选最后一项CloneURI 4.弹出对话框,URI ...

  4. 关于angularjs dom渲染结束再执行的问题

    情景 当我点击了button, div才能显示.并且我想知道这个div的高度. 问题 当我点击这个button以后这个.chrome就然告诉我这个div高度是0.这不是睁着眼睛说瞎话吗?怎么能如此欺骗 ...

  5. 系统封装 ES3使用方法

    1 什么是系统封装? 系统封装,说简单就是把系统制作成镜像的方法制作Ghost镜像文件,用在系统安装上面.系统封装,不同于系统的正常安装.最本质的区别在于 系统封装 是将一个完整的系统以拷贝的形式打包 ...

  6. PS 如何制作环绕文字效果

    最终效果 地球素材 1.打开素材,使用椭圆选区工具按住shift绘制正圆选区 2.转到路径面板,将选区变为工作路径 3.选择文字工具,在路径上输入文字 4.ctrl+T,按住ctrl+alt,鼠标拖动 ...

  7. Solidworks如何在自定义的基准面上创建3D草图

    1 选择某个基准面 右击"基准面上的3D草图"   2 当基准面出现黄色框即为正确.

  8. SQL语句练习手册--第二篇

    一.书到用时方恨少:"图书-读者-借阅"类题目 1.1 本题目的表结构 本题用到下面三个关系表: CARDS 借书卡. CNO 卡号,NAME 姓名,CLASS 班级 BOOKS ...

  9. Xcode强大的多视图立体分层显示View UI Herarchy

    Xcode能够显示执行页面的立体uivew结构图,能够让你看到一个页面包括哪些视图,在哪一层,在页面的什么位置. 一看就能看到你的uiview是否显示.显示在哪里了. 用鼠标点击页面移动鼠标能够看到页 ...

  10. Android轻量级日志管理框架

    代码地址如下:http://www.demodashi.com/demo/12134.html ViseLog Android 轻量级日志框架,使用森林对象维护不同的日志树进行日志输出,可以是Logc ...