ZerOx4Cの日記だったもの

インポートだけしました

† 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を変換して使用してたんですねー。我ながら邪悪なコードだと思いました。