1

次のステートメントでエラーが発生します。

liPages = (List<ListItem>)(ViewState["CurrentSetOfPages"]);

私が得ているエラーは次のとおりです。

Type 'System.Web.UI.WebControls.ListItem' in Assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.

しかし、私が以下を使用すると、すべてが完璧に機能するようです..

liPages = (List<ListItem>)(Session["CurrentSetOfPages"]);

これについて私を明確にしてください..

4

3 に答える 3

2

ViewState にアイテムを格納した結果、それらはページ上の文字列に格納されるため (複数のリクエスト間で状態を維持するため)、シリアライズ可能である必要があります。一方、セッションはメモリ ストレージ内にあります (InProc モードを使用している場合は、これはデフォルトであり、それ以外の場合は適用されません)、オブジェクトをシリアライズ可能にする必要はありません。

さらに、明確化のためにこの回答を参照してください: なぜ Viewstate can contain only serializable object?

お役に立てれば。

于 2013-10-03T13:13:27.467 に答える
1

Viewstateシリアライズ可能なオブジェクトのみを含むことができますが、シリアライズ可能なオブジェクトSessionは必要ありません。これが、コードがビューステートではなくセッションに対して機能する理由です。

また、you can't store an object in viewstate unless it's marked as serializable.

Viewstate は常に、シリアル化されたオブジェクトとしてブラウザーに返されます。そのため、シリアライズ可能なオブジェクトのみをその中に配置できます。シリアライズ可能なオブジェクトを入れないと、内容を表すことができません。

于 2013-10-03T13:18:48.987 に答える
0

ビューステート:

ViewState でのシリアル化と逆シリアル化はObjectStateFormatterに依存しており、List (ジェネリック リスト) 型はサポートされていません。したがって、エラーが発生します。

これを解決するには、独自のシリアル化を処理する必要があります。[Serializable]属性を使用して機能させることができます。stackoverflow のこの投稿を参照してください。あなたの場合、ListItem オブジェクトから継承するカスタム クラスを作成し、[Serializable]属性を適用する必要があります。

セッション: stackoverflow のこの投稿を参照してください

于 2013-10-03T13:33:05.690 に答える