将对象列表存储到会话变量时获取序列化异常

时间:2017-05-10 15:49:16

标签: c# ajax asp.net-mvc

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

这是我从第一页到第二页时使用的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<ClubVM>时,我得到了序列化异常:

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<ClubVM> clubs

1 个答案:

答案 0 :(得分:1)

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

这表示您打算将类序列化(存储为字节集。)这就是将对象保存到Session时会发生的情况。根据{{​​1}}的实现,对象可以存储在内存中,也可以保存到数据库中。

Session

[Serializable()] public class ClubVM { public int ID { get; set; } /* ... */ } 等值类型已经可序列化。但是,如果int包含对其他类型的引用,那么除非使用ClubVM属性标记它们,否则这些类型也必须是可序列化的。等等。但是,如果你标记了一些NonSerialized,这意味着当你反序列化对象(从NonSerialized中检索它)时,该属性将会丢失,因为当序列的其余部分被序列化时它不包括在内。