連載 .NETで簡単XML 第12回 オブジェクトをXMLでシリアライズ(4)株式会社ピーデー 川俣 晶2003/12/23 |
|
|
XmlRoot属性やXmlType属性とスキーマの関係
シリアライズ時に、XML文書の形式に影響を与えるさまざまな属性が用意されていることはすでに説明したが、それらの属性は、スキーマにも影響を及ぼすことができる。実際に、XmlRoot属性やXmlType属性が、xsd.exeによってスキーマを生成する際に、その内容に影響を及ぼしていることを確認してみよう。
まず、以下のようなクラスを用意してみた。すでに使用したサンプル・プログラム1-1のクラスにXmlRoot属性とXmlType属性を付けたものである。
|
|
サンプル・プログラム3:XmlRoot属性とXmlType属性をつけたPersonクラス(VB.NET版/C#版) |
これをビルドした上で、以下のコマンドによりスキーマを生成してみる。
xsd (アセンブリのファイル名) /t:Person |
すると次のようなスキーマが生成された。
|
|
属性を追加したPersonクラスより生成されたスキーマ |
これをVisual Studio .NETで開くと、以下のように見える。
属性ありで生成されたスキーマの表示 |
これを、属性なしで生成したスキーマをVisual Studio .NETで開いた画面(前掲したものと同じ画面)と比較してみよう。
属性なしで生成されたスキーマの表示 |
属性なしの場合、左側のボックスに、Personというキーワードが並んで2つ見えていた。しかし、属性ありの例では、personとPersonTypeという名前に変わっている。
まず、Personがpersonに変わったところに注目しよう。これは要素の名前ではあるが、XmlRoot属性によってルート要素の名前を変更したことが反映されたものである。属性の指定が、シリアライズされるXML文書だけでなく、xsd.exeによって生成されるスキーマにも適用されていることが分かると思う。それにより、安心して、xsd.exeによって生成されるスキーマで、シリアライズされたXML文書の妥当性を検証できるわけである。
次に、PersonがPersonTypeに変わったところに注目しよう。これは、データ型の名前が変わったことに対応したものであり、XmlType属性の引数で指定した名前が反映されたものである。しかし、シリアライズされるXML文書内に、PersonTypeというキーワードが出現することはない。このキーワードはスキーマ定義で使用される型の名前を指定する手段としてのみ機能する。XmlType属性は、スキーマを一切使わない場合には不必要な機能だが、できるだけ分かりやすいスキーマを自動生成させたいと思うなら、有益な機能といえる。
さて、このスキーマからもう一度xsd.exeを使用してソース・コードを生成すると、どうなるだろうか。
|
|
サンプル・プログラム4:属性ありで生成されたスキーマから自動作成したソース・ファイル(VB.NET版/C#版) |
属性なしのソース・コードからスキーマを生成し、そこからソース・コードを生成した場合と上記の結果を比較してほしい。
まずクラスの名前が変化していることが分かるだろう。前の例と異なり、スキーマ上で指定されたデータ型の名前であるPersonTypeがクラスの名前になっている。そして、XmlRoot属性によって、実際にXML文書に書き込まれる要素名personを指定する記述が追加されている。このように、xsd.exeを経由して変換する場合、スキーマの型と、生成されるソース・コードの内容は、影響を与え合うわけである。これを上手く使えば、ソース・コード上での読みやすさと、XML文書上での読みやすさを両立させることが可能になるだろう。
さて、今回でシリアライズの話題は一段落なのだが、これで終わりではない。本連載の第9回で触れたように、.NET Frameworkには、XmlSerializerクラス(System.Xml.Serialization名前空間)を使用する方法のほかに、別のシリアライズの機能(Serializable属性を用いる方法)が存在しているのである。次回は、それについて、解説したいと思う。また、それに加えて、Webサービスで行われるシリアライズの仕組みについて分かりにくい部分を解説し、XmlSerializerを使ってエンコード済みSOAP形式でシリアライズする方法にも触れたいと思う。
INDEX | ||
.NETで簡単XML | ||
第12回 オブジェクトをXMLでシリアライズ(4) | ||
1.xsd.exeによるスキーマの自動生成 | ||
2.スキーマからソースの生成 | ||
3.XmlRoot属性やXmlType属性とスキーマの関係 | ||
「連載 :.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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|