Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可序列化类中的属性在ASP.NET中插入会话对象时是否自动序列化?_Asp.net_Asp.net Mvc_Serialization_Deserialization - Fatal编程技术网

可序列化类中的属性在ASP.NET中插入会话对象时是否自动序列化?

可序列化类中的属性在ASP.NET中插入会话对象时是否自动序列化?,asp.net,asp.net-mvc,serialization,deserialization,Asp.net,Asp.net Mvc,Serialization,Deserialization,我有一个ASP.NET应用程序,它使用InProc会话状态模式。我有一个标记为可序列化的类: namespace MyNamespace { [Serializable] public class MyClass { public System.Web.Mvc.SelectList myList { get; set; } } } …现在我有一个疑问:将序列化类中的属性值指定给会话对象时,如下所示: Session["MyList"] = Ins

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

namespace MyNamespace
{
    [Serializable]
    public class MyClass
    {
        public System.Web.Mvc.SelectList myList { get; set; }
    }
}
…现在我有一个疑问:将序列化类中的属性值指定给会话对象时,如下所示:

Session["MyList"] = InstaceOfMyClass.myList;
。。。一旦插入会话[“myList”]对象,myList属性是否自动序列化


如果它没有序列化,我如何在插入到会话[“MyList”]对象时序列化它?通过指定具有可序列化属性的属性?

如果您仅讨论进程内,则不会发生序列化,该项存储为对.NET对象的正常实时引用,不会发生序列化

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

关于您的特定点,您正在执行的操作与手动创建
SelectList
对象并将其传递到会话中没有区别


如果我是你,我强烈建议你不要在会话中存储这样的对象,尽量将其保存在你控制的类中(并且可以标记为可序列化的),因为如果你确实需要切换到进程外存储,你就不需要重新设计代码。

如果你只谈论进程内存储,序列化不会发生,该项存储为对.NET对象的正常实时引用,不会发生序列化

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

关于您的特定点,您正在执行的操作与手动创建
SelectList
对象并将其传递到会话中没有区别


如果我是您,我强烈建议您不要在会话中存储这样的对象,尽量将其保存在您控制的类中(并且可以标记为可序列化的),因为如果您确实需要切换到进程外存储,则无需重新设计代码。

序列化并传递模型(以及一些额外的数据)从控制器到视图(如System.Web.Mvc.SelectList所示)是两件截然不同的事情

序列化与将对象转换为字符串(或二进制数组)以及从字符串(或二进制数组)反序列化回对象有关

在MVC上来回传递的模型是视图应该呈现的。您可能在该模型中寻找要显示在下拉列表(或html
或更一般的组合框)中的单个属性(例如,国家列表-Id和名称对)应通过ViewBag或ViewData传递


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

序列化并将模型(和一些额外数据)从控制器传递到视图(如System.Web.Mvc.SelectList所示)是两件截然不同的事情

序列化与将对象转换为字符串(或二进制数组)以及从字符串(或二进制数组)反序列化回对象有关

在MVC上来回传递的模型是视图应该呈现的。您可能在该模型中寻找要显示在下拉列表(或html
或更一般的组合框)中的单个属性(例如,国家列表-Id和名称对)应通过ViewBag或ViewData传递


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

如果只是进程中的,则该对象仅存储为对.NET对象的正常实时引用,不会发生(或需要)序列化。如果会话状态为外部(例如数据库)显然,此时它们需要序列化。@DavidG是的,我正在将InProc迁移到进程外会话状态模式,如sql或服务器状态。如果它只是进程内的,则该对象仅存储为对.NET对象的正常实时引用,不会发生(或需要)序列化。如果您的会话状态是外部的(例如数据库)然后很明显,它们需要在那个时候序列化。@DavidG是的,我正在将InProc迁移到进程外会话状态模式,如sql或服务器状态。我现在正在使用InProc,但我想迁移到状态服务器或sql。您指的是什么样的重新设计?在这种特殊情况下,如果我保持原样,它会工作吗?不会工作w因为
System.Web.Mvc.SelectList
没有标记为可序列化。这就是为什么我建议您使用自己的类型。好的,我理解,对不起,我对Web编程非常陌生…这个项目是由其他人完成的…所以我需要迁移到进程外。那么如何使System.Web.Mvc.SelectList在进程外工作?我需要什么怎么办?你不能