C# WCF DataContractSerializer 类

     原文地址:点击打开链接 

     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。

源代码来源:点击打开链接

以上就是C# WCF DataContractSerializer 类的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:25:33
下一篇 2025年12月17日 06:25:40

相关推荐

  • C# datatable中重复数据去重

    #region datatable去重 /// /// datatable去重 /// /// 需要去重的datatable /// 依据哪些列去重 /// public static DataTable GetDistinctTable(DataTable dtSource, params str…

    好文分享 2025年12月17日
    000
  • C# 实体类序列化与反序列化二 (DataContractSerializer)

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.IO;using System.Xml;…

    好文分享 2025年12月17日
    000
  • C# 将一个对象转换为指定类型

    原文地址:点击打开链接 适用:普通的对象,并且有默认的无参数构造函数 #region 将一个对象转换为指定类型 /// /// 将一个对象转换为指定类型 /// /// 待转换的对象 /// 目标类型 /// 转换后的对象 public static object ConvertToObject(o…

    好文分享 2025年12月17日
    000
  • C# Json 序列化与反序列化二

    /// /// 将对象转换为 JSON 字符串 /// /// /// /// public static string ScriptSerialize(T input) { string _jsonString = string.Empty; if (input != null) { JavaSc…

    好文分享 2025年12月17日
    000
  • C# 根据KeyEventArgs与组合键字符串相互转换

    /// 快捷键相关的类 /// public static class HotKeyInfo { /// /// 根据KeyEventArgs生成组合键字符串 /// /// /// public static string GetStringByKey(KeyEventArgs e) { if (…

    好文分享 2025年12月17日
    000
  • C# 内存管理

    windows使用一个系统:虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windows在后台管理。其实际结果是”位处理器上的每个进程都可以使用4gb的内存ˉ—无论计算机上实际有多少硬盘空间(在64位处理器上,这个数字会更大。这个4gb的内存实际上包含了程序的所…

    2025年12月17日
    000
  • C# DataTable中返回列中的最大值

    此处以表dt2中的keyIndex列(int类型)为例 1、通过linq来实现 int maxKeyIndex = dt2.AsEnumerable().Select(t => t.Field(“keyIndex”)).Max();linq语法:点击打开链接2、通过compute方法来实现 i…

    好文分享 2025年12月17日
    000
  • 使用 Override 和 New 关键字进行版本控制(C# 编程指南)

    原文地址:点击打开链接  这具有多方面的意义。例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。 它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。 在 C# 中,派生类可以包含与基类方法同名的…

    好文分享 2025年12月17日
    000
  • C#基础知识整理 基础知识(19) 值类型的装箱和拆箱(二)

    如果代码中会造成编译器的反复装箱,可改为手动装箱,这样来使代码执行更快,看下面代码: //手动装箱 Int32 v = 5; //由于string.Format的参数是object类型,所以这里会造成三次装箱。 Console.WriteLine(string.Format(“{0},{1},{2}…

    好文分享 2025年12月17日
    000
  • C#基础知识整理 基础知识(20) 委托(一)

    委托和事件在c#中使用很多,尤其在进行窗体编程时,很多的操作都要通过委托和事件来处理和传递。这里详细解释下委托和事件的用法和原因,使我们在写代码时能更加明白一些。委托的使用事件是一种机制,事件是通过委托实现的,所以看明白了委托,对于事件也就能更好的理解了。先看下面一个小例子。这是描述不同语言的程序员…

    2025年12月17日
    000
  • C#基础知识整理 基础知识(21) 委托(二)

    看了前面一篇委托的用法中http://www.php.cn/,我们看到, public void Description(string programerName, DescriptionDelegate description) { description(programerName); } 这个…

    2025年12月17日
    000
  • C# 使用绑定句柄来减少进程的内存耗用

    许多应用程序中,绑定了一组类型(type)或者类型成员(从memberinfo派生),并将这些对象保存在某种形式的一个集合中。以后,会搜索这个集合,查找特定的对象,然后调用这个对象。这是一个很好的机制,但是有个小问题:type和memberinfo派生的对象需要大量的内存。如果一个应用程序容纳了太多…

    好文分享 2025年12月17日
    000
  • C# 反射详解

    以上就是C# 反射详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

    2025年12月17日
    000
  • C# 清除事件绑定的函数

    c#  清除事件绑定的函数 #region 清除事件绑定的函数 /// /// 清除事件绑定的函数 /// /// 拥有事件的实例 /// 事件名称 public static void ClearAllEvents(object objectHasEvents, string eventName)…

    好文分享 2025年12月17日
    000
  • C#中Encoding.Unicode与Encoding.UTF8的区别

    原文地址:点击打开链接 今天在园子首页看到一篇博文-简单聊下Unicode和UTF-8,从中知道了UTF-8是Unicode的一种实现方式: Unicode只是给这世界上每个字符规定了一个统一的二进制编号,并没有规定程序该如何去存储和解析。 可以说UTF-8是Unicode实现方式之一……

    2025年12月17日
    000
  • C# Protobuf-Net 序列化

    源码位置:protobuf-net 1、安装Nuget : 工具–拓展管理器 安装完成后重启Microsoft Visual Studio 2010,可以看到下图: 小注: 只有该解决方案已经打开项目的时候,才会看到下面两项: 2、安装protobuf_net(在Nuget中找到prot…

    2025年12月17日 好文分享
    000
  • C# 文件流压缩解压

    /// /// 文件流压缩解压 /// public class ZipHelper { public static int BEST_COMPRESSION = 9; public static int BEST_SPEED = 1; public static int DEFAULT_COMPR…

    好文分享 2025年12月17日
    000
  • C# DataSet性能最佳实践

    c# 性能优化细节 1、使用ItemArray实现对DataRow的批量赋值 在对DataRow的所有字段赋值时,使用字段名进行逐列赋值效率较低。这时应尽量使用批量字段赋值。可以使用ItemArray或rows.Add方法: / ds是数据集(DataSet)对象DataTable dt = ds.…

    好文分享 2025年12月17日
    000
  • C# 字符串操作–减少垃圾回收压力

    c# 性能优化细节 1、使用string.Empty给一个空字符串变量赋初始值 String.Empty是一个指代,而””是具体的实现 string filter=“”;//不建议 string filter=string.Empty; //建议 2、使用str.Length == 0做空串比较 最…

    好文分享 2025年12月17日
    000
  • C# 异常处理(Catch Throw)IL分析

    1、catch throw的几种形式及性能影响: private void Form1_Click(object sender, EventArgs e) { try { } catch { throw; } } private void Form1_Load(object sender, Even…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信