開発用メモ

背景

FreeTrainでセーブデータをロードする時、大したデータでもないのに
環境によっては10〜20分も掛かってしまう、という問題に悩まされていました。
どうやら、株式プラグインに原因があるらしいことは解っていましたが、
外部アセンブリにあるタイプの解決が遅いためだと思っていました。

概要

セーブ&ロードに異常に時間がかかるので、delegateをシリアライズすべきではない。

詳細

結局、原因は、株式プラグインに含まれるStockPriceクラスで
delegateのフィールドをシリアライズしていたためでした。
onMinChange, onMaxChangeのフィールドを[NonSerialized]属性にすることで
セーブ&ロードの時間は大幅に短縮しました。

※言い訳
javaでも、リスナは通常シリアライズしない、というのは知っていましたが、
StockPriceのonMinChange,onMaxChangeの実体は素性の知れたオブジェクトだし、
再登録が面倒だからシリアライズしちゃってもいいかな?と思ってました。

なお、ロード後に完全に同じ状態に復元するには、
onMinChange,onMaxChangeを再登録しなければいけません。
StockPriceクラスでは、StockPriceLogger#restoreListenersというメソッド
で、delegateの再登録をしています。

StockPrice.csソース

1/851

Last-modified: 2008-05-10 (土) 00:40:04 (944d)