sgen の出力を csc 7.10.6001.4 でコンパイルする
.NET Framework 2.0 の sgen の出力を .NET 1.1 の csc でコンパイルしちゃいましょう。*1
まずは sgen を /keep で実行し、ソースコードを得ます。そのままではコンパイルできません。
sgen の出力するアセンブリには4つのクラスが含まれていて、
- XmlSerializationWriterXXX
- XmlSerializationReaderXXX
- XXXSerializer
- XmlSerializerContract
となっています。*2 このうち XmlSerializerContract は今回は除いておくことにします。
alias の削除
まず、最初に気が付くのはネームスペースが global:: で修飾されているので、これを排除する必要があるということ。
XmlSerializerContract の削除
XmlSerializerContract の親クラス XmlSerializerImplementation が存在しないので、とりあえずこのクラスには消えてもらいます。
XmlSerializationWriter のメソッドの変更
いくつかのメソッドの引数が変更になっているのを修正します。たとえば、WriteStartElement は、
.NET 1.1: void WriteStartElement(string name, string ns, object o, bool writePrefixed)
.NET 2.0: void WriteStartElement(string name, string ns, object o, bool writePrefixed, XmlSerializerNamespaces xmlns)
となっているため、最後の xmlns を削除するなどが必要になります。
(ここまでの修正で XmlSerializationWriterXXX を使用してシリアライズ可能になりました)
XmlSerializationReader のメソッド変更
XmlSerializationWriter 同様に XmlSerializationReader も修正を行います。たとえば、
.NET 1.1: void UnknownNode(object o)
.NET 2.0: void UnknownNode(object o, string qnames)
なんて違いがあります。ReaderCount 関連は checkDeserializerAdvance を持たない .NET 1.1 では無用なので削除しても問題ないでしょう。