どうも、開発環境そのものの動きがたまにおかしい。今も、上記の列挙可能にしたクラスなどを含んだアプリが、ArrayListを含んだクラスをデシリアライズするところで、以下のようなエラーが出た。
Exception: System.InvalidOperationException Message: Viewer.Templates は IEnumerable から継承されるため、Add(System.Object) メソッドを実装しなければなりません。 Source: System.Xml at System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type) at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, Boolean canBePrimitive, MemberInfo memberInfo) at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference) at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source) at System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo) at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo) at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns) at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, Boolean repeats)
このクラスは、実際にシリアライズされるオブジェクトの、プロパティのプロパティという位置づけ。そもそも、プロパティとして読み書きで公開しているわけではないので、自然とシリアライズ系処理の対象からはずれるはずなのだが...
ビルドしなおしてもだめ。Visual Studioを立ち上げなおしてもだめ。結局、PCを再起動したらこのエラーは出なくなった。
なんなの?
たしかに、デシリアライズするオブジェクトが列挙に対応する場合、通常、IEnumerableのインプリメントにはGetEnumeratorメソッドの実装だけでよいところを、Addメソッドを追加する必要があるそうだ。これは、デシリアライズで戻ってきたデータを反映させる必要があるため。ただ、この場合、まったくここはデシリアライズの対象ではない。
なんでかなぁ。
(後日談)
この現象、原因は明確にはわからないが、id:frontline:20050224 に書いた方法で回避できた。