3

Webページでは、次のように保存しDictionaryていViewStateます:

Dictionary<string, string> items = new Dictionary<string, string>();
ViewState["items"] = items;

それはうまくいきます。ただし、何らかの理由で、Dictionary直接使用するのではなく、独自のクラスを使用したい:

class MyDictionary : Dictionary<string, string> 
{
   ... 
}
MyDictionary items = new MyDictionary();
ViewState["items"] = items;

期待どおりに動作しません。ASP.NETは事実について不平を言っています

MyDictionary はシリアライズ可能とマークされていません

クラス属性は継承されないので問題ありません。だから私は自分のコードを変更しました:

[Serializable]
class MyDictionary : Dictionary<string, string> { ... }

しかし、そうすると、今度はページのポストバック後に別のエラー メッセージが表示されます。

このページの状態情報は無効であり、破損している可能性があります。
System.Web.UI.ObjectStateFormatter.Deserialize(ストリーム入力ストリーム)

viewstate が をシリアル化できる場合Dictionary、それを継承するクラスでは機能しないのはなぜですか? これを機能させる方法は?

4

1 に答える 1

4

クラスへの逆シリアル化コンストラクターが必要です。

class MyDictionary : Dictionary<string, string> 
{
   public MyDictionary (){ }
   protected MyDictionary (SerializationInfo info, 
                           StreamingContext ctx) : base(info, ctx) { }
}

辞書クラスの内部を見ると、逆シリアル化するためにこれが必要です。

protected Dictionary(SerializationInfo info, StreamingContext context);

テストページで試してみましたが、正常に動作します。

于 2012-08-29T09:28:58.753 に答える