Heim >Backend-Entwicklung >C#.Net-Tutorial >C# WCF DataContractSerializer-Funktion

C# WCF DataContractSerializer-Funktion

黄舟
黄舟Original
2017-02-15 11:28:381369Durchsuche

Ursprüngliche Adresse: Klicken Sie hier, um den Link zu öffnen

DataContractSerializer-Klasse

Serialisiert und deserialisiert Typinstanzen mithilfe des bereitgestellten Datenvertrags in einen XML-Stream oder ein XML-Dokument. Diese Klasse kann nicht vererbt werden.

Namespace: System.Runtime.Serialization

Assembly: System.Runtime .Serialization (in System.Runtime.Serialization.dll)

Bemerkungen

Verwenden Sie die DataContractSerializer-Klasse, um Typen zu konvertieren, die Instanzen sind serialisiert und deserialisiert in XML-Streams oder Dokumente. Sie können angeben, welche Eigenschaften und Felder serialisiert werden sollen, indem Sie das DataContractAttribute-Attribut auf Klassen und das DataMemberAttribute-Attribut auf Klassenmitglieder anwenden.

Die wörtliche Bedeutung ist: Datenvertragsserialisierung. In diesem Artikel wird hauptsächlich die Serialisierung und Deserialisierung mit DataContractSerializer erläutert Das DataContractAttribute: Diese Funktion kann nur für Aufzählungen, Klassen und Strukturen verwendet werden und kann nicht auf Schnittstellen angewendet werden. Aus dem Schlüsselwort „sealed“ wissen wir, dass das DataContractAttribute nicht vererbt werden kann. Das AllowMutiple-Attribut ist False, was bedeutet, dass nur ein DataContractAttribute-Attribut auf einen Datentyp angewendet werden kann.

Aus der obigen Definition von DataContractAttribute können wir ersehen, dass DataContractAttribute nur 5 Attributelemente enthält, von denen Name und Namespace den Namen und Namespace des Datenvertrags darstellen und IsReference angibt, ob die vorhandene Referenz des Datenvertrags beibehalten werden soll Objekt während der Serialisierung, der Standardwert dieses Attributs ist False.

Datenvertragsmitglieder übernehmen einen Anzeigeauswahlmechanismus, das heißt, Attribute/Felder von Datentypen, auf die das DataContractAttribute-Attribut angewendet wird, generieren nicht automatisch Datenmitglieder des Vertrags, sondern nur die Attribute/Felder, auf die zugegriffen wird auf das das DataMemberAttribute-Attribut angewendet wird. Seien Sie Mitglied des Datenvertrags.

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



Auf DataMemberAttribute von oben angewendet Gemessen an das AttributeUsageAttribute-Attribut, dieses Attribut kann nur auf Felder und Attribute angewendet werden. Denn nur diese beiden Elemente sind „Daten“-Mitglieder. Die vier Attribute haben jeweils die folgende Bedeutung.


Name: Der Name des Datenelements, standardmäßig der Name des Felds oder Attributs.

Order: Die Position, an der das entsprechende Datenelement im endgültigen serialisierten XML erscheint. Je kleiner der Order-Wert, desto besser ist der Test.

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

IsRequired: Gibt an, ob das Attributmitglied ein erforderliches Mitglied ist. Der Standardwert ist „false“, was darauf hinweist, dass dieses Mitglied standardmäßig verwendet werden kann.


EmitDefaultValue: Ruft einen Wert ab oder legt ihn fest, der angibt, ob der Standardwert des zu serialisierenden Felds oder der Eigenschaft serialisiert werden soll. true, wenn der Standardwert des Mitglieds im Serialisierungsstream generiert werden soll; andernfalls false. Der Standardwert ist wahr.

  • Quellcode-Quelle: Klicken Sie hier, um den Link zu öffnen
  • Das Obige ist der Inhalt der C# WCF DataContractSerializer-Klasse. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn