博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# WCF DataContractSerializer 类
阅读量:6898 次
发布时间:2019-06-27

本文共 5758 字,大约阅读时间需要 19 分钟。

     原文地址: 

     DataContractSerializer 类

     使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档。 无法继承此类。

     命名空间:  System.Runtime.Serialization  

     程序集:   System.Runtime.Serialization(在 System.Runtime.Serialization.dll 中)

备注

      使用 DataContractSerializer 类可以将类型实例序列化和反序列化为 XML 流或文档。 通过将 DataContractAttribute 特性应用于类,而将DataMemberAttribute 特性应用于类成员,可以指定要序列化的属性和字段。

      从字面意思来理解就是:数据契约序列化,本文主要是讲解用DataContractSerializer 序列化和反序列化.

      DataContractAttribute与DataMenmberAttribute

//------------------------------------------------------------// Copyright (c) Microsoft Corporation.  All rights reserved.//------------------------------------------------------------ namespace System.Runtime.Serialization{	// 摘要:    //     指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。    //     若要使其类型可序列化,类型作者必须为其类型定义数据协定。    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)]    public sealed class DataContractAttribute : Attribute    {        string name;        string ns;        bool isNameSetExplicitly;        bool isNamespaceSetExplicitly;        bool isReference;        bool isReferenceSetExplicitly;		// 摘要:        //     初始化 System.Runtime.Serialization.DataContractAttribute 类的新实例。        public DataContractAttribute()        {        }		 // 摘要:         //     获取或设置一个值,该值指示是否保留对象引用数据。         //         // 返回结果:         //     如果使用标准 XML 保留对象引用数据,则为 true;否则为 false。 默认值为 false。        public bool IsReference        {            get { return isReference; }            set            {                isReference = value;                isReferenceSetExplicitly = true;            }        } 	        public bool IsReferenceSetExplicitly        {            get { return isReferenceSetExplicitly; }        } 		//         // 摘要:         //     获取或设置类型的数据协定的命名空间。         //         // 返回结果:         //     协定的命名空间。        public string Namespace        {            get { return ns; }            set            {                ns = value;                isNamespaceSetExplicitly = true;            }        }         public bool IsNamespaceSetExplicitly        {            get { return isNamespaceSetExplicitly; }        } 		//        // 摘要:        //     获取或设置类型的数据协定的名称。        //        // 返回结果:        //     数据协定的本地名称。 默认值是应用了该属性的类的名称。        public string Name        {            get { return name; }            set            {                name = value;                isNameSetExplicitly = true;            }        }         public bool IsNameSetExplicitly        {            get { return isNameSetExplicitly; }        }     }}

DataContractAttribute

      从应用在DataContractAttribute上的AttributeUsageAttribute特性看,该特性只能用于枚举、类、结构体而不能应用于接口,从关键字sealed知道DataContractAttribute是不可被继承的。AllowMutiple属性为False,表明一个数据类型上只能应用一个DataContractAttribute特性。
      从上面对DataContractAttribute定义看出DataContractAttribute仅仅包含5个属性成员,其中Name和Namespace表示数据契约的名称和命名空间,IsReference表示在进行序列化的时候是否保持对象现有的引用结构,该属性默认值为False。
       数据契约成员采用显示选择机制,也就是说,应用了DataContractAttribute特性的数据类型的属性/字段不会自动生成契约的数据成员,而只有那些应用了DataMemberAttribute特性的属性/字段才属于数据契约的成员。

//------------------------------------------------------------// Copyright (c) Microsoft Corporation.  All rights reserved.//------------------------------------------------------------ namespace System.Runtime.Serialization{	 // 摘要:     //     当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer     //     进行序列化。    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]    public sealed class DataMemberAttribute : Attribute    {        string name;        bool isNameSetExplicitly;        int order = -1;        bool isRequired;        bool emitDefaultValue = Globals.DefaultEmitDefaultValue; 		 // 摘要:         //     初始化 System.Runtime.Serialization.DataMemberAttribute 类的新实例。        public DataMemberAttribute()        {        }         //        // 摘要:        //     获取或设置数据成员名称。        //        // 返回结果:        //     该数据成员的名称。 默认值是应用该属性的目标的名称。        public string Name        {            get { return name; }            set { name = value; isNameSetExplicitly = true; }        }         public bool IsNameSetExplicitly        {            get { return isNameSetExplicitly; }        } 		 //         // 摘要:         //     获取或设置成员的序列化和反序列化的顺序。         //         // 返回结果:         //     序列化或反序列化的数字顺序。        public int Order        {            get { return order; }            set            {                if (value < 0)                    throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.OrderCannotBeNegative)));                order = value;            }        }		// 摘要:         //     获取或设置一个值,该值用于指示序列化引擎在读取或反序列化时成员必须存在。         //         // 返回结果:         //     如果该成员是必需的,则为 true;否则为 false。         //         // 异常:         //   System.Runtime.Serialization.SerializationException:         //     该成员不存在。        public bool IsRequired        {            get { return isRequired; }            set { isRequired = value; }        } 	    // 摘要:        //     获取或设置一个值,该值指定是否对正在被序列化的字段或属性的默认值进行序列化。        //        // 返回结果:        //     如果应该在序列化流中生成成员的默认值,则为 true;否则为 false。 默认值为 true。        public bool EmitDefaultValue        {            get { return emitDefaultValue; }            set { emitDefaultValue = value; }        }    }}
DataMemberAttribute

      从上面应用在DataMemberAttribute上的AttributeUsageAttribute特性来看,该特性只能应用在字段和属性上。因为只有这两种元素才是“数据”成员。4个属性分别表示如下的含义。

  •  Name:数据成员的名称,默认为字段或属性的名称。
  •  Order:相应的数据成员在最终序列化的XML中出现的位置,Order值越小越考前,默认值为-1.
  • IsRequired:表明属性成员是否是必须的成员。默认值为false,表明该成员是可以缺省的。
  • EmitDefaultValue :获取或设置一个值,该值指定是否对正在被序列化的字段或属性的默认值进行序列化。如果应该在序列化流中生成成员的默认值,则为 true;否则为 false。 默认值为 true。
源代码来源:

转载地址:http://oyjdl.baihongyu.com/

你可能感兴趣的文章
脚本实现检测nginx服务是否正常
查看>>
利用nodejs监控文件变化并使用sftp上传到服务器
查看>>
Java邮件发送
查看>>
mysql 数据库的维护,优化
查看>>
JQuery动画
查看>>
Linux终端里用Shell和C输出带颜色的文字
查看>>
LAMP_apache结合php_4
查看>>
Linux+Nginx+Apache+Atlas+Mysql+Php+Redis 分部式部署详细版
查看>>
js form 表单的提交
查看>>
linux笔记基础
查看>>
Linux 高可用(HA)集群基本概念
查看>>
mysql(设置/更改mysql密码,连接MySQL,MySQL常用命令,MySQL两种引擎区别)
查看>>
Out of memory: Kill process 解决
查看>>
设计模式之代理模式之读写分离!!!
查看>>
Windows server 2003 SSL 配置
查看>>
web service简介
查看>>
软路由 - 开篇
查看>>
mac下Fiddler的安装-启动
查看>>
maven 插件
查看>>
java泛型学习3之类型参数的限制
查看>>