Hello, i have problem with serialization my session object. What i'm doing wrong? I tried serialize that object with XmlSerializer and BinaryFormatter and there was no problem.
When i try save the basket object to the session i'll get error:
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.
here is the object:
[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 that manipulates with 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
}
if i use InProc Session State, it works. So it must be in serialization process