Являются ли свойства внутри класса Serializable автоматически сериализованными при вставке в объект Session в ASP.NET? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение ASP.NET, которое использует режим состояния сеанса InProc.У меня есть класс, помеченный как сериализуемый:

namespace MyNamespace
{
    [Serializable]
    public class MyClass
    {
        public System.Web.Mvc.SelectList myList { get; set; }
    }
}

... Теперь у меня есть сомнения: при назначении значения свойства в сериализованном классе для объекта сеанса, как показано ниже:

Session["MyList"] = InstaceOfMyClass.myList;

... является ли свойство myList автоматически сериализованным после вставки в объект Session ["MyList"]?

Если оно не сериализовано, как я могу его сериализовать при вставке в объект Session ["MyList"]?указать свойство с сериализуемым атрибутом?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Сериализация и передача модели (и некоторых дополнительных данных) из контроллера в представление (как указано в System.Web.Mvc.SelectList) - это две очень разные вещи.

Сериализация связана с превращением объекта в строку (или двоичный массив) и десериализацией обратно из строки (или двоичного массива) в объект.

Модель, передаваемая назад и вперед в MVC, - это то, что должно отображать представление. Вы, вероятно, ищете одно свойство в этой модели (скажем, countryID), которое будет отображаться в раскрывающемся списке (или HTML <select> или, в более общем случае, поле со списком). Этот пакет данных обертки (скажем, список стран - пары Id и name) должен передаваться через ViewBag или ViewData.

Список SelectList НЕ должен выполняться во время сеанса, так как его хранение - большая трата памяти. Он просто останется в памяти надолго после того, как пользователь получит свой HttpResponse. Список выбора - это просто список параметров в поле со списком, и поэтому он не сериализуем (хотя его содержимое может быть). Вы должны действительно провести различие между «данными, населяющими поле со списком» (тонкий объект) и «само поле со списком» (толстый объект). В этом примере - между странами (которые являются IEnumerable) и элементом UI. Сериализация элемента пользовательского интерфейса не имеет смысла, и его всегда следует избегать.

1 голос
/ 11 июня 2019

Если вы говорите только о незавершенном процессе, сериализация не происходит, элемент сохраняется как обычная оперативная ссылка на объект .NET, сериализация не происходит.

Если ваше состояние сеанса является внешним (например, база данных), то, очевидно, их необходимо сериализовать в этой точке.

Что касается вашей конкретной точки, то нет разницы между тем, что вы делаете, исоздание объекта SelectList вручную и передача его в сеанс.

Если бы я был вами, я бы настоятельно рекомендовал вам не хранить подобные объекты в сеансе, постарайтесь сохранить его для классов, которыми вы управляете(и может помечаться как Serializable), потому что, если вам нужно переключиться на внешнее хранилище, вам не нужно будет заново проектировать свой код.

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