3

私が書いたサイトで、コードを更新した直後にセッションに保存されているアイテムが突然認識されないという奇妙な問題が発生しています。Stackoverflow / google /などを検索したところ、他の人が同じ問題を抱えているのに、どこにも解決策が見つからないことがわかりました。

これが大まかに起こっていることです:

バスケットにアイテムを追加すると、セッションにアイテムが保存List<BasketItem>されます。List<BasketItem>次に、(BasketItemではなく)コードを更新すると、セッション変数はまだ存在しますが、.NETは、それが間違いなくそうであるとしても、それがそうであるとは思わないようです。

コードを変更した後でバスケットアイテムのリストを取得しようとInvalidCastExceptionすると、変換対象のタイプが異なっていても基本的には異なると言っているため、意味がありません。

例外は次のとおりです。

System.InvalidCastException:[A] System.Collections.Generic.List1 1[BasketItem] cannot be cast to [B]System.Collections.Generic.List[BasketItem]。タイプAは、場所「C:\ Windows \ assembly \ GAC_64 \ mscorlib \ 2.0.0.0__b77a5c561934e089 \mscorlib.dll」のコンテキスト「LoadNether」の「mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089」に由来します。 。タイプBは、場所「C:\ Windows \ assembly \ GAC_64 \ mscorlib \ 2.0.0.0__b77a5c561934e089 \mscorlib.dll」のコンテキスト「LoadNether」の「mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=b77a5c561934e089」に由来します。 。

セッション状態にStateServerを使用していて、それが役立つ場合はASP.NET3.5SP1を実行しています。

私が使用しているコードは以下のとおりです。

// for setting the basket
List<BasketItem> basketItems = new List<BasketItem>();
Session["basket"] = basketItems;

// for getting the basket
List<BasketItem> basketItems = (List<BasketItem>)Session["basket"];

今のところ、「キャストとして」を使用しているので、エラーは発生しませんが、コードが更新されたときにユーザーのバスケットが失われていることを意味します。

アドバイスをいただければ幸いです。

乾杯

ティム

4

1 に答える 1

1

このタイプの問題は、基になるタイプのデータを格納する方法が原因でかなり一般的です。これは、意図したものとまったく同じにBinaryFormatter解決されない場合に問題を引き起こす可能性があります。ほとんどの場合、これは、アプリケーション/ライブラリのバージョンを変更するとき、または状態が異なるさまざまなサーバーがある場合に問題になります。BasketItem

ここでの私の強力なアドバイスBinaryFormatterは、状態を保存するために使用させないことです。この点とタイプの他のいくつかの問題の両方で、バージョンフレンドリーではありません。可能であれば、代わりに強力な契約ベースのデータを検討することをお勧めします(つまり、実質的に/以外のもの)。例:BinaryFormatterNetDataContractSerializer

  • JavaScriptSerializer基本的なstringデータを使用して保存できます
  • XmlSerializer基本的なstringデータを使用して保存できます
  • バイナリが必要な場合は、protobuf-netを使用しbyte[]て、データの一部をストローすることができます

次に、ヘルパーメソッドを使用して、データを保存/取得します。通常は、一般的なデータをvoid Store<T>(string key, T object)使用し、必要に応じて内部的T Retreive<T>(string key)に使用します。typeof(T)これの利点は、保存されたデータが特定の実装に対して中立であり、アプリケーションの他のバージョン(タイプに依存するものがないため)、および必要に応じて他のプラットフォーム(Java、phpなど)でも使用できることです。 。

これが直接的な解決策ではなく、問題の回避策であることを感謝しますが、それは機能します。

于 2011-12-07T10:18:46.340 に答える