Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielcode-Analyse der XML-Serialisierung und Deserialisierung von XmlSerializer-Objekten

Beispielcode-Analyse der XML-Serialisierung und Deserialisierung von XmlSerializer-Objekten

黄舟
黄舟Original
2017-03-09 16:57:011469Durchsuche

Der diesem Aufsatz entsprechende .Net-Namespace ist System.Xml.Serialization; der Beispielcode im Artikel muss auf diesen Namespace verweisen.

Warum müssen wir serialisieren und deserialisieren?

Wenn das .Net-Programm ausgeführt wird, befinden sich die Objekte im Speicher, wenn sie zur Verwendung an andere Systeme übergeben werden müssen oder beim Herunterfahren gespeichert werden müssen Sie können wieder verwendet werden, wenn das Programm erneut gestartet wird. Erfordert Serialisierung und Deserialisierung.

Geltungsbereich: In diesem Artikel wird nur die XML-Serialisierung vorgestellt. Tatsächlich kann die Serialisierung eine binäre Serialisierung oder eine Serialisierung in anderen Formaten sein.

Schauen Sie sich den einfachsten XML-Serialisierungscode an

class Program
{
    static void Main(string[] args)
    {
        int i = 10;
        //声明Xml序列化对象实例serializer
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //执行序列化并将序列化结果输出到控制台
        serializer.Serialize(Console.Out, i);
        Console.Read();
    }
}

Der obige Code ist für int korrekt i Die Serialisierung wird durchgeführt und das Serialisierungsergebnis wird an die Konsole ausgegeben. Das Ausgabeergebnis lautet wie folgt:

<?xml version="1.0" encoding="gb2312"?>
<int>10</int>

Die obige serialisierte XML kann deserialisiert werden. Der folgende Code

static void Main(string[] args)
{
    using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
<int>10</int>"))
    {
        //声明序列化对象实例serializer 
        XmlSerializer serializer = new XmlSerializer(typeof(int));
        //反序列化,并将反序列化结果值赋给变量i
        int i = (int)serializer.Deserialize(rdr);
        //输出反序列化结果
        Console.WriteLine("i = " + i);
        Console.Read();
    }
}

Der obige Code veranschaulicht den XML-Serialisierungs- und Deserialisierungsprozess auf einfachste Weise. Die .Net-Systemklassenbibliothek ist Wir haben viel gemacht Der Arbeitsaufwand und die Serialisierung und Deserialisierung sind sehr einfach. In der Realität sind die Geschäftsanforderungen jedoch oft komplexer und es ist unmöglich, eine int-Variable einfach zu serialisieren. Während der Anzeige müssen wir komplexe Typen kontrollierbar serialisieren.

Xml-Serialisierung von benutzerdefinierten Objekten:

Es gibt eine Reihe von Feature-Klassen im System.Xml.Serialization-Namespace, um die Serialisierung komplexer Typen zu steuern. Zum Beispiel XmlElementAttribute, XmlAttributeAttribute, XmlArrayAttribute, XmlArrayItemAttribute, XmlRootAttribute usw.

Sehen Sie sich ein kleines Beispiel an. Es gibt eine benutzerdefinierte Klasse „Katze“. Die Klasse „Katze“ hat drei Attribute: Farbe, Sprichwort und Geschwindigkeit.

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //声明一个猫咪对象
            var c = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            //序列化这个对象
            XmlSerializer serializer = new XmlSerializer(typeof(Cat));

            //将对象序列化输出到控制台
            serializer.Serialize(Console.Out, c);

            Console.Read();
        }
    }

    [XmlRoot("cat")]
    public class Cat
    {
        //定义Color属性的序列化为cat节点的属性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed属性
        [XmlIgnore]
        public int Speed { get; set; }

        //设置Saying属性序列化为Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}

Sie können XmlElement verwenden, um Attribute anzugeben, die in untergeordnete Knoten serialisiert werden sollen (standardmäßig werden sie in untergeordnete Knoten serialisiert). XmlAttribute-Attribut zur Angabe der Attributserialisierung. Es handelt sich um ein Attribut des XML-Knotens. Es kann auch durch das XmlIgnore-Attribut geändert werden, um zu verlangen, dass der Serialisierer das geänderte Attribut nicht serialisiert.


Xml-Serialisierung des Objekt-Arrays:

Xml-Serialisierung des Arrays erfordert die Verwendung von XmlArrayAttribute und XmlArrayItemAttribute gibt das Array-Element an XML-Knotenname, XmlArrayItemAttribute gibt den XML-Knotennamen des Array-Elements an.

Das folgende Codebeispiel:

/*玉开技术博客 http://www.php.cn/ */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace UseXmlSerialization
{
    class Program
    {
        static void Main(string[] args)
        {
            //声明一个猫咪对象
            var cWhite = new Cat { Color = "White", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };
            var cBlack = new Cat { Color = "Black", Speed = 10, Saying = "White or black,  so long as the cat can catch mice,  it is a good cat" };

            CatCollection cc = new CatCollection { Cats = new Cat[] { cWhite,cBlack} };

            //序列化这个对象
            XmlSerializer serializer = new XmlSerializer(typeof(CatCollection));

            //将对象序列化输出到控制台
            serializer.Serialize(Console.Out, cc);

            Console.Read();
        }
    }

    [XmlRoot("cats")]
    public class CatCollection
    {
        [XmlArray("items"),XmlArrayItem("item")]
        public Cat[] Cats { get; set; }
    }

    [XmlRoot("cat")]
    public class Cat
    {
        //定义Color属性的序列化为cat节点的属性
        [XmlAttribute("color")]
        public string Color { get; set; }

        //要求不序列化Speed属性
        [XmlIgnore]
        public int Speed { get; set; }

        //设置Saying属性序列化为Xml子元素
        [XmlElement("saying")]
        public string Saying { get; set; }
    }
}

Der obige Code gibt Folgendes aus:

<?xml version="1.0" encoding="gb2312"?>
<cats xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema">
  <items>
    <item color="White">
      <saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying>
    </item>
    <item color="Black">
      <saying>White or black,  so long as the cat can catch mice,  it is a good
cat</saying>
    </item>
  </items>
</cats>

XmlSerializer-Speicherleckproblem:

Danke Chenlulouis, ich habe mir MSDN genau angesehen, es gibt tatsächlich ein Leck, die MSDN-Beschreibung lautet wie folgt:

Dynamisch generierte Assemblys

Um die Leistung zu verbessern, generiert die XML-Serialisierungsinfrastruktur dynamisch Assemblys, um bestimmte Typen zu serialisieren und zu deserialisieren. Diese Infrastruktur wird diese Baugruppen finden und wiederverwenden. Dieses Verhalten tritt nur auf, wenn der folgende Konstruktor verwendet wird:

XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)

Wenn ein anderer Konstruktor verwendet wird, wird dasselbe Programm mehrfach generiert Versionen des Satzes erstellt und nie entladen, was zu Speicherverlusten und langsamer Leistung führt. Die einfachste Lösung besteht darin, einen der beiden zuvor genannten Konstruktoren zu verwenden. Andernfalls muss die Assembly in einer Hashtable zwischengespeichert werden, wie im folgenden Beispiel gezeigt.

Das heißt, wir verwenden XmlSerializer für die Serialisierung. Bei der Initialisierung des XmlSerializer-Objekts ist es am besten, die folgenden beiden Konstruktoren zu verwenden, da es sonst zu Speicherverlusten kommt.
XmlSerializer(Typ)
XmlSerializer >

Das obige ist der detaillierte Inhalt vonBeispielcode-Analyse der XML-Serialisierung und Deserialisierung von XmlSerializer-Objekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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