我有一个使用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”]对象时对其进行序列化?通过指示具有序列化属性的属性?
答案 0 :(得分:1)
如果仅是在进程中,则不会发生序列化,该项目将作为对.NET对象的常规实时引用存储,因此不会进行序列化。
如果您的会话状态是外部的(例如数据库),那么很明显,此时需要将它们序列化。
关于您的特定观点,您在做什么与手动创建SelectList
对象并将其传递到会话之间没有区别。
如果我是您,我强烈建议您不要在会话中存储此类对象,请尝试将其保留在您控制的类中(并可以标记为Serializable
),因为如果您确实需要要切换到进程外存储,则无需重新设计代码。
答案 1 :(得分:1)
序列化和将模型(以及一些额外的数据)从控制器传递到视图(如System.Web.Mvc.SelectList所示)是两个非常不同的事情。
串行化与将对象转换为字符串(或二进制数组)并将反序列化从字符串(或二进制数组)返回到对象有关。
在MVC上来回传递的模型是视图应呈现的内容。您可能正在寻找该模型中的单个属性(例如countryID)以显示在下拉列表(或html <select>
或更一般的组合框中)中。这捆包装数据(例如-国家/地区列表-ID和名称对)应通过ViewBag或ViewData传递。
不应在会话上执行SelectList,因为存储它会浪费大量内存。用户收到HttpResponse之后,它就会在内存中徘徊很长时间。选择列表只是组合框中选项的列表,因此它不能序列化(尽管它的内容可能是)。您应该真正区分“居住在组合框中的数据”(瘦对象)和“组合框本身”(胖对象)。在此示例中-在国家(这是IEnumerable)与UI元素之间。序列化UI元素没有任何意义,应始终避免。