C#-错误-未标记为可序列化

我得到的错误是:

Type 'OrgPermission' in Assembly 'App_Code.ptjvczom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. 

这是我的代码:

我有一个gridview,它使用以下数据源:

 <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetOrgList" 
            TypeName="Org">
    <SelectParameters>
      <asp:SessionParameter Name="orgCodes" SessionField="UserOrgs" Type="Object" />
       <asp:Parameter DefaultValue="Y" Name="active" Type="String" />
    </SelectParameters>
 </asp:ObjectDataSource>

我在页面加载中设置会话变量,如下所示:

User cUser = new User(userid);
//make sure the user is an Admin
List<OrgPermission> orgs = new List<OrgPermission>();
foreach(OrgPermission org in cUser.orgs)
   {
     if (org.type=='admin')
     {
        orgs.Add(org);                       
     }
   }
Session["UserOrgs"] = orgs;

我的用户类如下所示:

public class OrgPermission
{
    public string Org { get; set; }   
    public List<string> type { get; set; }

    public OrgPermission()
    { }    
}
public class cUser
{    
    public string userid { get; set; }
    public List<OrgPermission> orgs { get; set; }

    public clsUser(string username)
    {
      //i set everything here
    }
}

我不明白为什么它坏了,可以在不使其可序列化的情况下使用它吗?

我尝试调试,会话变量设置得很好,然后进入GetOrgList并返回了正确的结果,但是该页面未加载,并且出现上述错误。

这是我的GetOrgList函数的一个片段:

public DataTable GetOrgList(List<OrgPermission> orgCodes, string active)
    {

        string orgList = null;

        //code to set OrgList using the parameter is here.

        DataSet ds = new DataSet();
        SqlConnection conn = new SqlConnection(cCon.getConn());
        SqlCommand cmd = new SqlCommand("sp_GetOrgList", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@orgList", orgList));
        cmd.Parameters.Add(new SqlParameter("@active", active));

            conn.Open();
            SqlDataAdapter sqlDA = new SqlDataAdapter();

            sqlDA.SelectCommand = cmd;
            sqlDA.Fill(ds);

            conn.Close();
        return ds.Tables[0];
    }
Madam Zu Zu asked 2020-02-12T06:13:57Z
3个解决方案
140 votes
[Serializable]
public class OrgPermission
burning_LEGION answered 2020-02-12T06:14:08Z
17 votes

如果以会话状态存储对象,则该对象必须可序列化。

[http://www.hpenterprisesecurity.com/vulncat/en/vulncat/dotnet/asp_dotnet_bad_practices_non_serializable_object_stored_in_session.html]


编辑:

为了正确地对会话进行序列化,应用程序存储为会话属性的所有对象都必须声明[Serializable]属性。 此外,如果对象需要自定义序列化方法,则它还必须实现ISerializable接口。

[https://vulncat.hpefod.com/en/detail?id=desc.structural.dotnet.asp_dotnet_bad_practices_non_serializable_object_stored_in_session#C%23%2fVB.NET%2fASP.NET]

nimeshjm answered 2020-02-12T06:14:47Z
1 votes

保留我的特定解决方案来促进繁荣,因为它是此问题的棘手版本:

Select<int>(...)

由于具有属性Select<int>(...)的类,例如:

[Serializable]
class MySessionData{
    public int ID;
    public IEnumerable<int> RelatedIDs; //This can be an issue
}

最初是通过不可序列化的列表设置27439204226841978197888的问题实例:

MySessionData instance = new MySessionData(){ 
    ID = 123,
    RelatedIDs = nonSerizableList.Select<int>(item => item.ID)
};

这里的原因是2743920422684684197888返回的具体类,具有不可序列化的类型数据,因此您需要将id复制到新的List<int>以解决它。

RelatedIDs = nonSerizableList.Select<int>(item => item.ID).ToList();
Jono answered 2020-02-12T06:15:24Z
translate from https://stackoverflow.com:/questions/15707872/error-is-not-marked-as-serializable