我的会话对象序列化有问题。我做错了什么?我尝试用XmlSerializer和BinaryFormatter序列化该对象,没有问题。
当我尝试将篮子对象保存到会话时,我会收到错误:
无法序列化会话状态。在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话状态对象,因此不允许使用不可序列化的对象或MarshalByRef对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则适用相同的限制。
这是对象:
[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)
由于我们没有剩下的代码,我们无法分辨该类的哪个部分是个问题。但你可以告诉你。
评论该课程的一半,然后再试一次。如果它有效,那么你注释掉的那一半就有问题了。如果它不起作用,那么你没有注释掉的那一半就有问题了。无论哪种方式,将问题的一半注释掉,然后重试......
这就像二元搜索一样。
答案 1 :(得分:0)
我发现了这个错误..
序列化过程可能不喜欢事件: - /
我只能使用InProc Session。