2009-04-13 5 views
1

J'ai un problème avec la sérialisation de mon objet de session. Qu'est-ce que je fais mal? J'ai essayé sérialiser cet objet avec XmlSerializer et BinaryFormatter et il n'y avait aucun problème.Sérialisation de l'état de la session

Lorsque je tente enregistrer l'objet du panier à la session je vais erreur:

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.

ici est l'objet:

[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} 
code

qui manipule avec la session:

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 

} 

si j'utilise InProc Session State, cela fonctionne. Donc, il doit être en processus de sérialisation

Répondre

0

J'ai trouvé le bug ..

processus de sérialisation ne probablement pas comme des événements: -/

Je dois utiliser uniquement Session InProc.

+0

L'avez-vous découvert en utilisant ma méthodologie de "recherche binaire"? Si vous l'aviez essayé, vous auriez découvert ce problème de cette façon. –

+0

J'ai utilisé la méthode tentative-erreur. :-) La sérialisation de session n'aime tout simplement pas les événements. –

0

Puisque nous n'avons pas le reste de votre code, nous ne pouvons pas dire quelle partie de cette classe est un problème. Mais vous pouvez dire.

Commentez la moitié de cette classe et réessayez. Si cela fonctionne, alors la moitié que vous avez commentée avait le problème. Si cela ne fonctionne pas, alors la moitié que vous n'avez pas commentée a le problème. Quoi qu'il en soit, commentez la moitié de la partie avec le problème et réessayez ...

Cela ressemble à une recherche binaire.

+0

J'ai ajouté le reste du code, je sauvegarde simplement l'objet à la session Session ["basket"] = new Basket(); –