ViewStateにクラスのインスタンスを保存しようとすると "シリアル化可能として設定されていません"エラーが発生する - ASP.NET

ViewStateにクラスのインスタンスを保存しようとすると "シリアル化可能として設定されていません"エラーが発生する現象の対処法を紹介します。

現象

ViewStateにクラスのインスタンスを保存しようとすると 以下のエラーが実行時に発生することがあります。
エラーメッセージ
アセンブリ '(アプリケーションのアセンブリ名), Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' の型 '(プロジェクト名).(クラス名)' はシリアル化可能として設定されていません。

原因

StateViewプロパティにはシリアライズ可能なクラスのみ設定できるため、独自に作成したクラスなどのシリアル化に対応していないクラスを代入しようとするとエラーが発生します。

エラーになるプログラム

UI


コード

MyClass01.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SimpleViewState
{
  public class MyClass01
  {
    public int ID;
    public string Name;
    public string Value;
  }
}

testpage01.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SimpleViewState
{
  public partial class testpage01 : System.Web.UI.Page
  {
    MyClass01 data;

    protected void Page_Load(object sender, EventArgs e)
    {
      if (ViewState["data"] == null) {
        MyClass01 mc1 = new MyClass01();
        mc1.ID = 5;
        mc1.Name = "Penguin";
        mc1.Value= "\\400";
        ViewState["data"] = mc1;
      }
      else {
        data = (MyClass01)ViewState["data"]; 
      }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      if (data != null) {
        Label1.Text = string.Format("{0:d} / {1:s} / {2:s}", data.ID, data.Name, data.Value);
      }
    }
  }
}

実行結果

上記のプログラムを実行すると、下図のエラーが発生します。

プログラムの修正

原因はMyClass01がシリアライズ可能でないため、MyClass01をシリアライズ可能なクラスにします。

事前準備

シリアライズ可能なクラスにするために必要な System.Runtime.Serialization アセンブリへの参照を追加します。

ソリューションエクスプローラのプロジェクトのノードを開き、[参照設定]ノードを選択します。右クリックしポップアップメニューの[参照の追加]を選択します。


[参照マネージャー]ダイアログが表示されますので、左側のツリービューの[アセンブリ]ノード内の[フレームワーク]を選択します。下図の画面が表示されます。
右側のアセンブリの一覧から"System.Runtime.Selialization"を探します。


"System.Runtime.Selialization"の左側のチェックボックスにチェックをつけます。チェック後ダイアログボックスの[OK]ボタンを押します。


"System.Runtime.Selialization"の参照が追加されました。

コードの変更

MyClass01.cs を下記のコードに変更します。

MyClass01.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.Serialization;


namespace SimpleViewState
{
  [Serializable]
  public class MyClass01
  {
    public int ID;
    public string Name;
    public string Value;
  }
}

解説

クラスの宣言部に"[Serializable]"を付加してクラスをシリアライズ可能にします。

実行結果

プロジェクトを実行します。下図の画面が表示されます。


ボタンをクリックするとViewStateに保存されたクラス情報を読み出し値をラベルに表示します。ViewStateにクラスの情報を保存できたことがわかります。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2013-05-30
iPentec all rights reserverd.