misc.log

日常茶飯事とお仕事と

VS.NET 2003の挙動が不審

どうも、開発環境そのものの動きがたまにおかしい。今も、上記の列挙可能にしたクラスなどを含んだアプリが、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 に書いた方法で回避できた。