会话状态序列化

时间:2009-04-13 09:29:51

标签: c# session serialization

我的会话对象序列化有问题。我做错了什么?我尝试用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会话状态,它可以工作。所以它必须在序列化过程中

2 个答案:

答案 0 :(得分:0)

由于我们没有剩下的代码,我们无法分辨该类的哪个部分是个问题。但可以告诉你。

评论该课程的一半,然后再试一次。如果它有效,那么你注释掉的那一半就有问题了。如果它不起作用,那么你没有注释掉的那一半就有问题了。无论哪种方式,将问题的一半注释掉,然后重试......

这就像二元搜索一样。

答案 1 :(得分:0)

我发现了这个错误..

序列化过程可能不喜欢事件: - /

我只能使用InProc Session。