■質問
SessionはSerializableAttributeの無いオブジェクトは
保存できないという情報がWEB上で散見されますが、
新しく「空のWebアプリケーション」のプロジェクトを作って
フォームを作成し、以下のコードを記述して実行すると
シリアライズできなさそうなListItemのインスタンスが
Sessionに保存できてしまうのはなぜでしょうか?
また、Sessionに代入時にSerializeExceptionなどの例外が発生する
サンプルコードや条件を知っていたら教えて欲しいです。
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Web; 5using System.Web.UI; 6using System.Web.UI.WebControls; 7 8namespace WebApplication1 9{ 10 public partial class WebForm1 : System.Web.UI.Page 11 { 12 protected void Page_Load(object sender, EventArgs e) 13 { 14 var sessionItem = Session["x"]; 15 if (sessionItem != null) 16 { 17 var sessionListItem = sessionItem as ListItem; 18 if (sessionListItem != null && 19 sessionListItem.Text == "hoge" && 20 sessionListItem.Value == "piyo") 21 { 22 // リロードするとここを通る 23 throw new InvalidOperationException("何故シリアライズされる?"); 24 } 25 } 26 27 var listItem = new ListItem("hoge", "piyo"); 28 if (listItem.GetType().IsSerializable || 29 Attribute.IsDefined(listItem.GetType(), typeof(SerializableAttribute)) || 30 Attribute.IsDefined(listItem.GetType(), typeof(System.Runtime.Serialization.DataContractAttribute)) || 31 listItem.GetType() == typeof(System.Xml.Serialization.IXmlSerializable)) 32 { 33 // ここは通らない 34 throw new InvalidOperationException("シリアライズ可能な場合は例外送出"); 35 } 36 37 Session.Add("x", listItem); 38 } 39 } 40}
■このコードの動作環境
Windows7 Professional
Visual Studio 2013
.NET Framework 2.0~4.5.1 (2.0の場合はDataContractAttributeが使えないのでその行を削除)
IIS Express
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/07 08:31