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

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

Mar 09, 2017 pm 04:57 PM

このエッセイに対応する .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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのデシリアライズ失敗を解決する方法 PHPのデシリアライズ失敗を解決する方法 Oct 11, 2023 am 09:30 AM

PHP デシリアライズ失敗の解決策 シリアライズされたデータを確認してください。クラス定義の確認、エラーログの確認、PHPのバージョンアップ、セキュリティ対策などを行います。詳細な紹介: 1. シリアル化されたデータを確認します。まず、シリアル化されたデータが有効であり、PHP のシリアル化仕様に準拠しているかどうかを確認します。データが破損しているか、形式が正しくない場合は、修復するか、バックアップから正しいデータを復元してください。 2. クラス定義を確認し、シリアル化されたデータで使用されているすべてのクラスが存在し、自動的にロードできることを確認します。クラスが存在しないかアクセスできない場合は、クラス定義の修復などを試みることができます。

C++ 関数ライブラリはシリアル化と逆シリアル化をどのように実行しますか? C++ 関数ライブラリはシリアル化と逆シリアル化をどのように実行しますか? Apr 18, 2024 am 10:06 AM

C++ ライブラリのシリアル化および逆シリアル化ガイド シリアル化: 出力ストリームの作成とアーカイブ形式への変換。オブジェクトをシリアル化してアーカイブします。逆シリアル化: 入力ストリームを作成し、アーカイブ形式から復元します。アーカイブからオブジェクトを逆シリアル化します。実践例: シリアル化: 出力ストリームの作成。アーカイブ オブジェクトを作成します。オブジェクトを作成してアーカイブにシリアル化します。逆シリアル化: 入力ストリームを作成します。アーカイブ オブジェクトを作成します。オブジェクトを作成し、アーカイブから逆シリアル化します。

PHP データ処理スキル: シリアル化関数とアンシリアル化関数を使用してデータのシリアル化と逆シリアル化を実装する方法 PHP データ処理スキル: シリアル化関数とアンシリアル化関数を使用してデータのシリアル化と逆シリアル化を実装する方法 Jul 29, 2023 am 10:49 AM

PHP データ処理スキル: シリアル化関数とアンシリアル化関数を使用してデータのシリアル化と逆シリアル化を実装する方法 シリアル化と逆シリアル化は、コンピューター サイエンスで一般的に使用されるデータ処理スキルの 1 つです。 PHP では、serialize() 関数と unserialize() 関数を使用して、データのシリアル化と逆シリアル化の操作を実装できます。この記事では、これら 2 つの関数の使用方法を詳しく紹介し、関連するコード例を示します。 1. コンピューター プログラミングにおけるシリアル化とデシリアル化とは何ですか?

Java のインターフェイスと抽象クラスのシリアル化と逆シリアル化 Java のインターフェイスと抽象クラスのシリアル化と逆シリアル化 May 02, 2024 am 08:33 AM

インターフェイスを直接シリアル化することはできません。ただし、抽象クラスは、非静的、非一時的なフィールドを含まない場合、または writeObject() および readObject() メソッドをオーバーライドしない場合に限り、インターフェイスを実装する具象クラスを通じて実装できます。または、writeObject() および readObject () メソッドの抽象クラス実装をオーバーライドします。

PHP の高性能シリアル化および逆シリアル化テクノロジ PHP の高性能シリアル化および逆シリアル化テクノロジ Jun 22, 2023 pm 09:34 PM

シリアル化はデータ構造またはオブジェクトを送信可能なデータ形式に変換するプロセスであり、逆シリアル化はこれらのデータを元のオブジェクトまたはデータ構造に復元するプロセスです。 Web 開発では、シリアル化および逆シリアル化テクノロジは、データ送信、キャッシュ、分散コンピューティングなどのシナリオで広く使用されています。一般的に使用される Web バックエンド開発言語として、PHP の組み込みのシリアル化および逆シリアル化機能はどのように実装されますか?この記事ではPHPでのシリアル化について紹介します。

Go 言語でのオブジェクトのシリアル化と逆シリアル化 Go 言語でのオブジェクトのシリアル化と逆シリアル化 Jun 03, 2023 am 08:31 AM

分散サーバー技術の適用により、オブジェクトのシリアル化と逆シリアル化の機能は、プログラマーの作業においてますます日常的なものになりました。 Go 言語では、オブジェクトのシリアル化と逆シリアル化を実装するためのさまざまな方法も提供されており、これらのメソッドの使用シナリオも異なります。この記事では、Go言語でのオブジェクトのシリアライズとデシリアライズの実装とその使い方を詳しく紹介します。 1. オブジェクトのシリアル化と逆シリアル化とは何ですか?オブジェクトのシリアル化と逆シリアル化は、後続の操作を容易にするためにオブジェクト データ構造を保存または転送可能な形式に変換することを指します。

PHP unserialize() 関数を使用して逆シリアル化を実装する PHP unserialize() 関数を使用して逆シリアル化を実装する Jun 27, 2023 am 08:01 AM

シリアル化は、データ構造またはオブジェクトを保存、送信、または表現のために文字列に変換し、逆に文字列を元のデータ構造またはオブジェクトに解析するプロセスです。 PHP では、serialize() 関数を使用して変数を文字列にシリアル化し、unserialize() 関数を使用して文字列をプリミティブ データ構造またはオブジェクトに逆シリアル化できます。この記事では、PHPunserialize() 関数の使用方法と注意事項を中心に説明します。 1. アンシリアライズ

flexjsonを使用してJavaのReaderストリームからJavaオブジェクトを逆シリアル化する方法は? flexjsonを使用してJavaのReaderストリームからJavaオブジェクトを逆シリアル化する方法は? Sep 10, 2023 pm 10:57 PM

Flexjson は、Java オブジェクトを JSON 形式にシリアル化および逆シリアル化するための軽量ライブラリです。 JSONDeserializer クラスの deserialize() メソッドを使用すると、Reader クラスのインスタンスを JSON 入力として使用して、Reader ストリームから Java オブジェクトを逆シリアル化できます。構文 publicTdeserialize(Readerinput) 例 importjava.io.*;importflexjson.JSONDeserializer;publicclassJSONDeserializeReaderTest{

See all articles