2009年5月21日木曜日

セッション変数で嵌る。


セッション周りのコードを見ていたら、

1.クラスのインスタンスをセッション変数に格納していた。
2.セッション変数から、インスタンスを取り出し、セッション変数に再格納していた。

こんな感じ

CSession.Book cb1 = new CSession.Book();
cb1.Id=bookId;
cb1.Title=TxtBookTitle.Text;
cb1.Author=TxtAuther.Text;
:
Session["BOOK"]=cb1;


別の処理で、
CSession.Book cs = (CSession.Book)Session["BOOK"];
if(cs!=null)
{
cs.Id="...";
cs.Title="....";
cs.Author="...";
:
if(regFlg)
{
Session["BOOK"] = cs;
}
}

気になった点は、CSession.Bookのクラスがシリアル化可能かということと、
Session["BOOK"] = cs;の行。

ASP.NETの状態管理のサービスを立ち上げて、web.configで、
<sessionState mode="StateServer" />
と記述すると、セッション格納時に例外が発生する。

CSession.Bookのクラス定義の上に[Serializable()]をつけることにより、
例外が発生しなくなったが、問題はSession["BOOK"] = csの行。この行は
意味がないように見える。

直前のif文で条件分岐をしているんだけど、cs自体が参照のためcsのメンバー
に値を代入した時点で、セッションに格納したインスタンスのメンバーの値
も変わっていることをプログラム作成者が認識してるかな?

0 件のコメント: