数据协定最重要的当然就是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. Hibernate分页功能数据重复问题

    今天遇到一个很憋屈的问题那就是hibernate分页查询中出现重复数据,本来一直没有在意,以为是数据问题,但是一查程序和数据都没有问题,继续深入查看,找到问题了就是order By 时出的问题,唉.. ...

  2. 新人补钙系列教程之:拒绝CPU高占用

    1.关于MovieClip和Sprite的鼠标事件,当不需要鼠标事件的时候将mouseEnabled和mouseChildren设为false. 不断的检测鼠标交互事件会消耗CPU,尤其是大量交互对象 ...

  3. tomcat修改默认访问首页

    找到conf下server.xml文件修改如下位置内容 <Host name="localhost" appBase="webapps" unpackWA ...

  4. 2017.5.24 在intelliJ IDEA 中生成war包

    1.勾选Build on make file -> project structure -> Artifacts 2.compile module "***" 选择项目 ...

  5. GridView后台绑定数据列表方法

    在很多时候数据绑定都是知道了数据表中的表字段来绑定GridView控件的,那时候我就有个想法希望通过表明来查询数据库中的字段来动态的绑定GirdView控件数据并提供了相关的操作列,在网上找了一些资料 ...

  6. <转>创建支持eclipse的多模块maven项目

    如何使用eclipse创建Maven工程及其子模块 1,首先创建一个父类工程   子模块继承父类工程      并在父类工程的pom.xml文件中定义引入的jar及其版本号     子模块可以引用 2 ...

  7. ubuntu安装rpm格式软件包

    转载自:http://os.51cto.com/art/200708/53942.htm ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb.用alien转 ...

  8. Java除法结果带小数、进一法的实现 Java问题通用解决代码

    http://blog.csdn.net/windone0109/article/details/5355379进一法: 即省略的位上只要大于零都要进一位 :  四舍五入法: 即省略的位上小于五都要舍 ...

  9. c#创建对象并动态添加属性

    //动态类,可以作为基类被继承 dynamic backObj = new ExpandoObject(); //ExpandoObject 为密封类 backObj.image0 = IMGNAME ...

  10. 如何从一个1G的文件中找到你所需要的东西

    如何从一个1G的文件中找到你所需要的东西,这个问题貌似面试的时候会经常问到.不过不论你用什么语言,肯定逃脱不了按指针读或者按块读. 这里介绍python的用法.本人亲自实验了,速度还可以. 如果你的文 ...