Сериализация состояния сеанса - PullRequest
1 голос
/ 13 апреля 2009

У меня проблема с сериализацией моего объекта сеанса. Что я делаю не так? Я попытался сериализовать этот объект с помощью 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 голосов
/ 13 апреля 2009

Я нашел ошибку ..

Процесс сериализации, вероятно, не любит события: - /

Мне нужно использовать только InProc Session.

0 голосов
/ 13 апреля 2009

Поскольку у нас нет остальной части вашего кода, мы не можем сказать, какая часть этого класса является проблемой. Но вы можете сказать.

Прокомментируйте половину этого класса и попробуйте снова. Если это работает, то у половины, которую вы прокомментировали, была проблема. Если это не сработает, то проблема в том, что вы не прокомментировали половину. В любом случае, закомментируйте половину части с проблемой в ней и попробуйте снова ...

Это похоже на бинарный поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...