在ASP.NET中的Session对象上插入后,Serializable类中的属性是否会自动序列化?

时间:2019-06-11 11:51:08

标签: asp.net asp.net-mvc serialization deserialization

我有一个使用InProc会话状态模式的ASP.NET应用程序。我有一个标记为可序列化的类:

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

...现在我有一个疑问:在将序列化类中的属性值分配给会话对象时,如下所示:

Session["MyList"] = InstaceOfMyClass.myList;

...将myList属性插入到Session [“ MyList”]对象后会自动序列化吗?

如果未序列化,如何在插入Session [“ MyList”]对象时对其进行序列化?通过指示具有序列化属性的属性?

2 个答案:

答案 0 :(得分:1)

如果仅是在进程中,则不会发生序列化,该项目将作为对.NET对象的常规实时引用存储,因此不会进行序列化。

如果您的会话状态是外部的(例如数据库),那么很明显,此时需要将它们序列化。

关于您的特定观点,您在做什么与手动创建SelectList对象并将其传递到会话之间没有区别。

如果我是您,我强烈建议您不要在会话中存储此类对象,请尝试将其保留在您控制的类中(并可以标记为Serializable),因为如果您确实需要要切换到进程外存储,则无需重新设计代码。

答案 1 :(得分:1)

序列化和将模型(以及一些额外的数据)从控制器传递到视图(如System.Web.Mvc.SelectList所示)是两个非常不同的事情。

串行化与将对象转换为字符串(或二进制数组)并将反序列化从字符串(或二进制数组)返回到对象有关。

在MVC上来回传递的模型是视图应呈现的内容。您可能正在寻找该模型中的单个属性(例如countryID)以显示在下拉列表(或html <select>或更一般的组合框中)中。这捆包装数据(例如-国家/地区列表-ID和名称对)应通过ViewBag或ViewData传递。

不应在会话上执行SelectList,因为存储它会浪费大量内存。用户收到HttpResponse之后,它就会在内存中徘徊很长时间。选择列表只是组合框中选项的列表,因此它不能序列化(尽管它的内容可能是)。您应该真正区分“居住在组合框中的数据”(瘦对象)和“组合框本身”(胖对象)。在此示例中-在国家(这是IEnumerable)与UI元素之间。序列化UI元素没有任何意义,应始终避免。