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