† Evil Code ~ 邪悪なる符号 †
すごく・・・厨二病です・・・
そんなことより今日まで書いてたコードが邪悪なことになってた。
[Serializable()] public class Foo { [NonSerialized()] private Bar bar; public Bar Bar { get { return this.bar; } set { this.bar = value; } } public int Number { get { return this.Bar.Number; } set { this.Bar.Number = value; } } } public class Bar { public int Number { get; set; } }
Fooクラスはシリアル化可能で、Barはシリアル化不可なので、FooのメンバのBarはNonSerialized属性を付けてシリアル化の対象から外してあります。
FooのメンバであるNumberはBar.Numberをそのまま返しています。
さて、このFooクラスをシリアル化するとどうなるでしょうか。知らずにこの状況を作り出したZerOxは昨晩から今まで悩みました☆
実際に、Fooをシリアル化してバイナリデータとしてファイルに保存、この時点でバイナリデータ内にFoo.Barの情報は存在しないので、このバイナリデータを逆シリアル化してもFoo.Barはnullとなります。
Foo.Bar == nullなので、Foo.Bar.Numberを取得しようとするとNullReferenceExceptionが発生します。Foo.Numberも同様です。
実は、ListViewの項目と実際のデータリストの内容の同期が面倒なので、このコードにおけるFooのプロパティ内でデータリストの型とListViewItemを変換して使用してたんですねー。我ながら邪悪なコードだと思いました。