連載 .NETで簡単XML 第9回 オブジェクトをXMLでシリアライズ(1)株式会社ピーデー 川俣 晶2003/10/15 |
|
|
XmlIgnoreAttribute属性を使用したシリアル化の防止
クラスには、一時的に必要とされる情報を保持する変数というものが存在する場合がある。例えば、計算に時間が掛かるので、繰り返し何回も同じ計算をするのではなく、計算結果を保管しておいて活用しようというような場合である。そういう一時的な情報は、シリアライズで出力する必要がない。一時的にシステムから与えられるID番号などは、むしろ保存すべきではないとだろう。システムを再起動してからそのID番号を使おうとしても、システムはすでにその番号を発行したことを忘れているかもしれない。
そのような用途のために、シリアライズの対象から除外するという機能が必要とされる。以下はそれを使用した例である。前のサンプル・プログラムと同じように、クラスとそれを扱う部分を分けて掲載する。
まず、クラスから。
|
|
サンプル・プログラム2-1:Personクラス(VB.NET版/C#版) |
次のリストは、このクラスをシリアライズする部分である。デシリアライズとそれを呼び出すForm1_Loadメソッドは前のサンプル・プログラム1-2と同一なのでここでは省略している。
|
|
サンプル・プログラム2-2:シリアライズを行うメソッド(VB.NET版/C#版) |
これを実行すると出力は以下のようになる。
山田太郎 |
生成されたXML文書は以下のようになる。
|
|
生成されたXML文書 |
ここで注目すべき点は、PersonクラスのTemporaryIDプロパティに付加されたXmlIgnore属性である。この属性は、通常は何の効力も持たない。しかし、XmlSerializerクラスを用いてシリアライズとデシリアライズを行う場合は、対象となるプロパティまたはフィールドを対象外とするという効力を発揮する。これにより、TemporaryIDプロパティの値はXML文書に書き込まれず、デシリアライズした結果にも設定した値が出力されていないことが分かるだろう。
もう1つ、出力される要素の順番に注意して頂きたい。最初の例では、Age→Nameの順だが、この例ではName→Ageの順に出力されている。この違いはどこから来るものなのだろうか。これはソース・コード内での出現順に対応している。最初の例で、Age→Nameという順番になっていたのは、メンバ・フィールドのAgeのあとにプロパティNameが記述されていたという理由による。そして、この例でName→Ageの順に出力されているのは、プロパティNameのあとにプロパティAgeが記述されているという理由による。
以上、今回はシリアライズおよびデシリアライズについての基本的なコーディングについて解説した。次回では、出力されるXMLで要素名や属性、名前空間を指定する方法、クラスに別のクラスへの参照が含まれる場合や配列が含まれる場合のシリアライズなど、シリアライズについてより詳しく掘り下げていく。
INDEX | ||
.NETで簡単XML | ||
第9回 オブジェクトをXMLでシリアライズ(1) | ||
1.シリアライズによるオブジェクトの永続化 | ||
2.シリアライズ/デシリアライズを行う例 | ||
3..XmlIgnoreAttribute属性を使用したシリアル化の防止 | ||
「連載 :.NETで簡単XML」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|