設定情報をクラス化して、Serialize、Deserializeを使ってXMLファイルに記録、読み込みしているのだが、ソースを軽くいじったり、また、設定情報じゃない部分をちょっといじっただけで、ビルド後のアセンブリが「シリアライズ失敗」というエラーを出すことがたまにあった。エラーログを見ると、どうやらArrayListに格納したオブジェクトを処理する際にエラーが出ているようだが、特にそのあたりをいじったわけでもなく発生しているのが気持ち悪い(id:frontline:20050129にもこの件について言及している)。
ソースを一度全部消して、SourceSafeから取り出しなおしたりすると直ったのだが、それではさすがに困るということで、同僚のi氏に調査を依頼。
なんとか改善できたようだ。
<XmlArrayItem("Settings_1", GetType(SettingObject_1))> _ Public Property Settings_1() As ArrayList Get Return Settings End Get Set(ByVal Value As ArrayList) mSettings_1 = Value End Set End Property
設定情報を格納したクラスプロパティを上記のように記述し、XmlArrayItemでArrayList内のオブジェクト型情報を指定していたのだが、これをやめて、SerializeやDeserializeオブジェクトのコンストラクタで、処理対象となる型情報を収めた配列を引き渡すという方法に切り替えた。
Dim TargetTypes() as Type = {GetType(SettingObject_1)} Dim serializer As XmlSerializer 'シリアライザオブジェクト生成 serializer = New XmlSerializer(DestinationType, TargetTypes)
どうしてこういう現象が発生するのかはよくわからない...。