コンテンツへスキップ
ものがたり
戻る

XsdDataContractImporterについて(半分くらい)

最近ここに技術系の話を書いていなかったので、ひさしぶりにWCFの話でも書いてみようかと思う。

XsdDataContractImporterは、svcutil.exeで使われているWCFのクラスライブラリの一部で、XML Schemaからdata contract typesを生成するものだ。XmlSchemaSetからCodeCompileUnitを生成するもの、と言えば、より具体的だろうか。

System.Xml.Serializationにも、XML SchemaからCodeDomを生成するXmlSchemaImporterというものが存在していて、目的はだいたい同じなんだけど、シリアライゼーションの仕組みはdata contractとXmlSerializerではだいぶ違っているし、そのため、これらが生成するクラスの構造もだいぶ違う。XsdDataContractImporterは、xml serializationとは全く異なる実装をゼロから作っているはずだ。具体的には:

一方、XsdDataContractImporterでは、スキーマの名前空間ごとにCodeNamespaceを生成する。XmlSchemaImporterは異なる名前空間で同一のlocal nameをもつelementを取り込むことに失敗している。

簡単に言えば、これらの制約は要するに、DataContractExporterで生成したスキーマくらいしかサポートしませんよ、ということだと思う。data contractにおけるスキーマの対応守備範囲はxml serializationよりも狭い。data contractでは対応範囲が狭くて困るという場合は、XsdDataContractImporterのOptions (of ImportOptions type)にImportXmlType = true を設定すると、守備範囲外のものはXmlNodeの配列として読み書きできるようになる(ニッチなのでmonoではまだ実装していないけど)。

これらはあくまで制約の話で、elementにmaxOccurs=“unbounded”がついたら配列になる等、いくつかのバリエーションがある。具体的なスキーマをもとにこの辺を説明(?)したものをsvnに放り込んでみたので、詳しく知りたい人は見てみるといいと思う。でもそんなこと知って何になるの…

ちなみに表題に「半分くらい」って書いてあるのは、ImportXmlTypeなど各種オプションを設定した場合に出力されるコードについて何も書いていないからで、残り半分について書く予定は今のところ無い。


この記事を共有:

前の記事
androidのパッチを作った
次の記事
國母問題について