ASP.NET でSessionでクラスインスタンスを扱う方法

ASP.NETで開発している際に、
Sessionでクラスのインスタンスを持ち回りたいシチュエーションが、
ままあります。

通常ではSessionにクラスインスタンスを代入するとエラーとなりますが、
以下のようにすると、Sessionでクラスのインスタンスを扱えるようになります。

<Serializable()> _
Public Class Customer 

    Private _Name As String = ""
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal Value As String)
            _Name = Value
        End Set
    End Property 

End Class


'セッションへ入れるステップ
Dim targetCustomer As Customer = New Customer
targetCustomer.Name = "ジョン"
Session("顧客") = targetCustomer


'セッションから取り出し
Dim targetCustomer As Customer = CType(Session("顧客"), Customer)
Dim customerName As String = targetCustomer.Name
targetCustomer.Name = "ジョージ"


Sessionで扱いたいクラスの先頭に「Serializable()」キーワードを付けることにより、
そのクラスがシリアライズ可能となり、Sessionで扱うことで出来るようになります。

ただし、シリアライズ可能とする際には、
以下の点に注意が必要です。

注意点

シリアライズ化するクラスが参照しているすべてのクラスにSerializable()キーワードを付与する必要がある。
Serializableを付与されたオブジェクトは循環参照される。

具体的な例で言えば、セッションから取り出し値を変更した場合に、
セッション内の値も変更されている。
※上記の例だと、targetCustomer.Name = "ジョージ"とした時に、
Session("顧客")内にあるCustomerクラスインスタンスのNameプロパティの値も変更されている。

基本データ型(stringなど)に比べて、パフォーマンスが落ちる。


参考
http://msdn.microsoft.com/ja-jp/library/ms973893.aspx