【问题标题】:Getting serialization exception when storing a list of object to session variable将对象列表存储到会话变量时出现序列化异常
【发布时间】:2017-05-11 00:18:30
【问题描述】:

我有一个表单,我想将输入字段值存储到会话变量中。该表单用于创建新用户:管理员用户将输入新用户的用户名,转到下一页添加其他信息,然后创建用户。所以,我想将他们放在第一页的信息存储到会话变量中,以便以后使用。问题是我遇到了序列化异常。

这是我从第一页到第二页时使用的 ajax:

function holdUserData() {
    //pass in username and a list of club IDs
    var data = {
        username: $('#tbUsername').val(), 
        clubs: this.clubs
    };

    $.ajax({
        type: "POST",
        url: '/Users/GoManageClub', //store in GoManageClub controller
        data: data,
        success: function (data) {
            //redirect to ManageClubAccess controller when done
            window.location = '/Users/ManagClubAccess';
        }
    })
}

还有我的GoManageClub 控制器,将数据存储到会话:

[HttpPost]
public ActionResult GoManagePolicy(string username, List<ClubVM> clubs)
{
    Session["Username"] = username;
    Session["Clubs"] = clubs;

    return this.Json(new { success = true });
}

当我只存储用户名字符串时,没有问题,变量存储成功。但是当我存储List&lt;ClubVM&gt; 时,我得到了序列化异常:

Type 'myOrganization.ClubVM' in Assembly 'myorg, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable

我的ClubVM

public class ClubVM
{
    public int ID { get; set; }
    /* ... */
}

我应该怎么做才能保存List&lt;ClubVM&gt; clubs

【问题讨论】:

    标签: c# ajax asp.net-mvc


    【解决方案1】:

    要序列化的类需要Serializable 属性。

    这表明您打算对类进行序列化(存储为一组字节)。当您将对象保存到Session 时会发生这种情况。根据Session 的实现,对象可以存储在内存中,也可以保存到数据库中。

    [Serializable()]
    public class ClubVM
    {
        public int ID { get; set; }
        /* ... */
    }
    

    int 这样的值类型已经可以序列化了。但是如果ClubVM 包含对其他类型的引用,那么这些类型也必须是可序列化的,除非您使用NonSerialized 属性标记它们。等等。但是,如果你标记了 NonSerialized,这意味着当你反序列化对象(从 Session 检索它)时,该属性将丢失,因为当对象的其余部分被序列化时,它没有包含在内。

    【讨论】:

    • 1) “序列化”意味着创建对象的 JSON 或 XML 表示。它不是“一组字节”。 2)存储在内存(In Proc)中的对象不需要序列化。如果您的会话存储类似于 SQL Server,这只是一个问题。
    • 序列化包括二进制序列化。它不限于 JSON 或 XML。它很可能是“一组字节”。无论Session 是如何序列化的,这都很重要。您不希望您的应用程序因为更改了 SessionState 实现而停止工作。
    • 这是一个非常真实的场景,顺便说一句。我开发了一个应用程序,它有一个庞大的、不可序列化的类,它存储在Session 中。它有各种疯狂的依赖。然后我们尝试实现基于 SQL 的 SessionState 并且不能不重写一半的应用程序。我们必须修改我们的负载平衡,以确保用户始终停留在同一台服务器上,他们的状态存储在内存中。任何事情都迫使他们切换失去会话的服务器。
    • 对我来说听起来绝对是个糟糕的设计。在 session 中存储一个巨大的、不可序列化的对象是相当明显的 session 滥用,几乎可以肯定应该以另一种方式处理。
    • 这是一个糟糕的设计和对Session的严重滥用。该对象拥有对任何事物的依赖关系。即使您将Session 从图片中删除,这也很糟糕。需要序列化的部分无法从其余部分中解脱出来,这一事实几乎说明了一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多