ホームページ >バックエンド開発 >XML/RSS チュートリアル >XmlSerializer オブジェクトの XML シリアル化と逆シリアル化のサンプル コード分析

XmlSerializer オブジェクトの XML シリアル化と逆シリアル化のサンプル コード分析

黄舟
黄舟オリジナル
2017-03-09 16:57:011550ブラウズ

このエッセイに対応する .Net 名前空間は System.Xml.Serialization です。記事内のサンプル コードはこの名前空間を参照する必要があります。

なぜシリアル化と逆シリアル化が必要なのでしょうか?

.Net プログラムが実行されるとき、メモリ内のオブジェクトを他のシステムに渡して使用する必要がある場合、またはシャットダウン時に再度使用できるように保存する必要がある場合。プログラムが再度開始されると、変更をシリアル化および逆シリアル化する必要があります。

範囲: この記事では XML シリアル化のみを紹介します。実際、シリアル化はバイナリ シリアル化または他の形式のシリアル化にすることができます。

最も単純な XML シリアル化コードを見てください

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();
    }
}

上記のコードは int i をシリアル化し、シリアル化の結果をコンソールに出力します。出力は次のとおりです

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

上記のシリアル化された XML と次のコードを使用します

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();
    }
}

上記のコードは、XML のシリアル化と逆シリアル化のプロセスを最も簡単な方法で示しています。多くの作業、シリアル化と逆シリアル化は非常に簡単です。 。ただし、実際には、ビジネス要件はより複雑であることが多く、表示では int 変数を単純にシリアル化することは不可能であり、複雑な型を制御可能にシリアル化する必要があります。

カスタム オブジェクトの Xml シリアル化:

System.Xml.Serialization 名前空間には、複合型のシリアル化を制御するための一連の機能クラスがあります。たとえば、XmlElementAttribute、XmlAttributeAttribute、XmlArrayAttribute、XmlArrayItemAttribute、XmlRootAttribute などです。

カスタム クラス Cat があります。Cat クラスには、Color、Saying、および Speed の 3 つの属性があります。

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

XmlElement を使用して、子ノードにシリアル化する属性を指定するか (デフォルトでは、子ノードにシリアル化されます)、またはオプティマイザーは変更されたプロパティをシリアル化しません。


オブジェクト配列の Xml シリアル化:

配列の Xml シリアル化では、XmlArrayAttribute と XmlArrayItemAttribute を使用する必要があります。XmlArrayAttribute は配列要素の Xml ノード名を指定し、XmlArrayItemAttribute は配列要素の Xml ノード名を指定します。

次のコード例:

/*玉开技术博客 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; }
    }
}

上記のコードは出力します:

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

状況、msdn の説明は次のとおりです:

動的に生成されたアセンブリ

パフォーマンスを向上させるため、XML シリアル化インフラストラクチャは、指定された型をシリアル化および逆シリアル化するアセンブリを動的に生成します。このインフラストラクチャは、これらのアセンブリを検索して再利用します。この現象は、次のコンストラクターを使用する場合にのみ発生します: XmlSerializer(Type) XmlSerializer がアンロードされると、メモリ リークが発生し、パフォーマンスが低下します。最も簡単な解決策は、前述の 2 つのコンストラクターのいずれかを使用することです。それ以外の場合は、次の例に示すように、アセンブリをハッシュテーブルにキャッシュする必要があります。




つまり、XmlSerializer をシリアル化に使用する場合は、次の 2 つのコンストラクターを使用するのが最善です。そうしないと、メモリ リークが発生します。
XmlSerializer(型)
XmlSerializer。

以上がXmlSerializer オブジェクトの XML シリアル化と逆シリアル化のサンプル コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。