Maison  >  Article  >  développement back-end  >  C# WCF DataContractSerializer ici

C# WCF DataContractSerializer ici

黄舟
黄舟original
2017-02-15 11:28:381331parcourir

Adresse originale : Cliquez pour ouvrir le lien

Classe DataContractSerializer

Sérialise et désérialise les instances de type dans un flux ou un document XML à l'aide du contrat de données fourni. Cette classe ne peut pas être héritée.

Espace de noms : System.Runtime.Serialization

Assemblage : System.Runtime .Serialization (dans System.Runtime.Serialization.dll)

Remarques

Utilisez la classe DataContractSerializer pour convertir les types d'instances sérialisés et désérialisés en flux ou documents XML. Vous pouvez spécifier les propriétés et les champs à sérialiser en appliquant l'attribut DataContractAttribute aux classes et l'attribut DataMemberAttribute aux membres de la classe.

Le sens littéral est : sérialisation du contrat de données. Cet article explique principalement la sérialisation et la désérialisation à l'aide de DataContractSerializer

DataContractAttribute De l'attribut AttributeUsageAttribute appliqué à. le DataContractAttribute See, cette fonctionnalité ne peut être utilisée que pour les énumérations, les classes et les structures et ne peut pas être appliquée aux interfaces. Grâce au mot-clé scellé, nous savons que le DataContractAttribute ne peut pas être hérité. L'attribut AllowMutiple est False, ce qui indique qu'un seul attribut DataContractAttribute peut être appliqué à un type de données.

D'après la définition ci-dessus de DataContractAttribute, nous pouvons voir que DataContractAttribute ne contient que 5 membres d'attribut, parmi lesquels Name et Namespace représentent le nom et l'espace de noms du contrat de données, et IsReference représente s'il faut conserver la référence existante du objet lors de la sérialisation. Structure, la valeur par défaut de cet attribut est False.

Les membres du contrat de données adoptent un mécanisme de sélection d'affichage, c'est-à-dire que les attributs/champs des types de données auxquels l'attribut DataContractAttribute est appliqué ne généreront pas automatiquement les membres de données du contrat, mais uniquement les attributs/champs à auquel l'attribut DataMemberAttribute est appliqué. Être membre du contrat de données.

//------------------------------------------------------------
// 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; }
        }
 
    }
}



DataMemberAttribute



Appliqué à DataMemberAttribute d'en haut À en juger par l'attribut AttributeUsageAttribute, cet attribut ne peut être appliqué qu'aux champs et aux attributs. Parce que seuls ces deux éléments sont membres « données ». Les quatre attributs représentent respectivement les significations suivantes.

Nom : Le nom du membre de données, par défaut le nom du champ ou de l'attribut.

//------------------------------------------------------------
// 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; }
        }
    }
}

Ordre : position où le membre de données correspondant apparaît dans le XML sérialisé final. Plus la valeur de l'ordre est petite, meilleur est le test.


IsRequired : indique si le membre de l'attribut est un membre obligatoire. La valeur par défaut est false, indiquant que ce membre peut être défini par défaut.

  • EmitDefaultValue : obtient ou définit une valeur qui spécifie s'il faut sérialiser la valeur par défaut du champ ou de la propriété en cours de sérialisation. true si la valeur par défaut du membre doit être générée dans le flux de sérialisation, sinon false ; La valeur par défaut est vraie.

  • Source du code source : Cliquez pour ouvrir le lien
  • Ce qui précède est le contenu de la classe C# WCF DataContractSerializer. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn