C# WCF DataContractSerializer 类

简介:      原文地址:点击打开链接      DataContractSerializer 类     使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档。 无法继承此类。     命名空间:  System.Runtime.Serialization       程序集:   System.Runtime.Serialization(在 System.Runtime.S

     原文地址:点击打开链接 

     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# 数据格式 XML
C# 实体类序列化与反序列化二 (DataContractSerializer)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.IO; using System.Xml; namespace Common.Utility.XMLSerializatio
905 0
|
XML 数据格式 C#
WCF 序列化与反序列化复杂类型(DataContractSerializer)
作者:jiankunking 出处:http://blog.csdn.net/jiankunking .NET的类型可以分为两种:声明类型和真实类型。我们提倡面向接口的编程,对象的真实类型往往需要在运行时才能确定,在编程的时候往往只需要指明类型的声明类型,比如类型实现的接口或者抽象类。当我们使用基于接口或者抽象类创建的DataContractSerializer去序列化一个实现了该接口或者
1333 0
|
XML 安全 数据格式
WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
原文:WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)]]大部分的系统都是以数据为中心的(Data Central),功能的实现表现在对相关数据的正确处理。
893 0
|
XML 数据格式 JSON
wcf基础教程之 数据契约的序列化DataContractSerializer
上一篇博客我们说明了数据契约的前身Xml的序列化,这次还是言归正传,回到wcf的技术上来,分析一下DataContractSerializer 。 首先我们必须了解wcf默认是通过xml进行数据传输,但是并不意味着就一定要用这种,还有轻量级的json。
621 0
|
C++
同时使用XmlSerializer和WCF的DataContractSerializer
今天在写代码是遇到这个错误。 Type ‘..’ cannot be ISerializable and have DataContractAttribute attribute. 只是因为在一个类里面同时使用.Net 1.1 的XmlSerializer 和.NET 3.5的DataContractAttribue所导致的。
662 0
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
73 0
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
111 0