2009-04-13 33 views
1

セッションオブジェクトのシリアル化に問題があります。私は間違っているの? XmlSerializerとBinaryFormatterでそのオブジェクトをシリアル化しようとしましたが問題はありませんでした。セッション状態のシリアル化

私はエラーを取得しますセッションにバスケットのオブジェクトを保存してみてください:ここ

Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

がオブジェクトである:セッションで操作する

[Serializable] 
public class Basket 
{ 
    #region Fields (2) 

    [NonSerialized] 
    private CMS.CmsEntity db; 

    private List<ShopOrderItem> ShopOrderItems; 

    #endregion Fields 

    #region Properties (2) 

    public bool IsEmpty 
    { 
     get 
     { 
      return (this.Items.Count == 0); 
     } 
    } 

    public List<ShopOrderItem> Items 
    { 
     get 
     { 
      if (this.ShopOrderItems == null) 
      { 
       this.ShopOrderItems = new List<ShopOrderItem>(); 
      } 

      return this.ShopOrderItems; 
     } 
     set 
     { 
      this.ShopOrderItems = value; 
     } 
    } 

    #endregion Properties 

    #region Delegates and Events (1) 

    // Events (1)  

    public event EventHandler CartItemsChanged; 

    #endregion Delegates and Events 

    #region Methods (9) 


    public int CountItems() 
    { 
     return this.ShopOrderItems.Sum(s => s.Quantity); 
    } 
    public decimal CountTotalAmount() 
    { 
     ... 
    } 
    public decimal CountTotalAmountWithoutVAT() 
    { 
     ... 
    } 
    public CMS.ProductVariant GetProductVariantById(int id) 
    { 
     ... 
    } 


    #region AddProductToCart 
    public void AddProductToCart(int productVariantId, int quantity) 
    { 
     AddProductToCart(GetProductVariantById(productVariantId), quantity); 
    } 
    public void AddProductToCart(ProductVariant productVariant, int quantity) 
    { 
     ... 
    } 
    #endregion 

    #region RemoveProductFromCart 
    public void RemoveProductFromCart(int productVariantId) 
    { 
     RemoveProductFromCart(GetProductVariantById(productVariantId)); 
    } 
    public void RemoveProductFromCart(ProductVariant productVariant) 
    { 
     .. 
    } 
    #endregion 

    #region UpdateProductQuantity 
    public void UpdateProductQuantity(int variantId, int quantity, bool isRelative) 
    { 
     UpdateProductQuantity(GetProductVariantById(variantId), quantity, isRelative); 
    } 
    public void UpdateProductQuantity(ProductVariant productVariant, int quantity, bool isRelative) 
    { 
     ... 
    } 
    #endregion 

    #endregion Methods} 

コード:

public static class CurrentSession 
{     

#region public static Basket Basket 
public static Basket Basket 
    { 
     get 
     { 
         Basket c = SessionHelper.GetSessionObject("UserCart") as Basket; 

         if (c == null) 
         { 
          c = new Basket(); 
          SessionHelper.SetSessionObject("UserCart", c); // If i comment this line, exception is not thrown 
         } 

         return c; 
     } 
     set 
     { 
         SessionHelper.SetSessionObject("UserCart", value); 
     } 
    } 
    #endregion 

} 

私はInProcセッション状態を使用する場合、それは動作します。したがって、シリアル化プロセスでなければなりません

答えて

0

私はバグを発見した。..

シリアル化プロセスは、おそらくイベント好きではない: -/

私はインプロセスのセッションを使用する必要があります。

+0

「バイナリ検索」方法論を使用してこれを発見しましたか?もしあなたがそれを試していたら、あなたはこのような問題を発見したでしょう。 –

+0

メソッドの試行ミスを使用しました。 :-) セッションのシリアライズはイベントを好きではありません。 –

0

コードの残りの部分がないので、そのクラスのどの部分に問題があるかはわかりません。しかし、を教えてください。

このクラスの半分をコメントアウトしてもう一度お試しください。それがうまくいけば、あなたがコメントした半分に問題があります。それがうまくいかない場合は、あなたがコメントしていない半分に問題があります。いずれにしても、問題のある部分の半分をコメントアウトしてもう一度試してみてください。

これはバイナリ検索と同じです。

+0

私は残りのコードを追加しました。セッションにオブジェクトを保存するだけです。Session ["basket"] = new Basket(); –

関連する問題