Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 错误-未标记为可序列化_C#_Asp.net_.net_Serialization - Fatal编程技术网

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

C# 错误-未标记为可序列化,c#,asp.net,.net,serialization,C#,Asp.net,.net,Serialization,我得到的错误是: 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" Selec

我得到的错误是:

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>

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

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;
User cUser=新用户(userid);
//确保用户是管理员
列表组织=新列表();
foreach(cUser.orgs中的OrgPermission组织)
{
if(org.type=='admin')
{
org.Add(org);
}
}
会话[“用户组织”]=组织;
我的用户类如下所示:

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
    }
}
公共类权限
{
公共字符串Org{get;set;}
公共列表类型{get;set;}
公共许可证()
{ }    
}
公共类cUser
{    
公共字符串用户标识{get;set;}
公共列表组织{get;set;}
公共clsUser(字符串用户名)
{
//我把一切都安排在这里了
}
}
我不明白它为什么会坏,我能在不使它可序列化的情况下使用它吗

我试着调试,会话变量设置得很好,然后它进入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];
    }
公共数据表GetOrgList(列出orgCodes,字符串处于活动状态) { 字符串orgList=null; //使用参数设置OrgList的代码如下。 数据集ds=新数据集(); SqlConnection conn=新的SqlConnection(cCon.getConn()); SqlCommand cmd=新的SqlCommand(“sp_GetOrgList”,康涅狄格州); cmd.CommandType=CommandType.storedProcess; cmd.Parameters.Add(新的SqlParameter(“@orgList”,orgList)); cmd.Parameters.Add(新的SqlParameter(“@active”,active)); conn.Open(); SqlDataAdapter sqlDA=新的SqlDataAdapter(); sqlDA.SelectCommand=cmd; sqlDA.Fill(ds); 康涅狄格州关闭(); 返回ds.表[0]; }
您需要向要序列化的类添加一个
Serializable
属性

[Serializable]
public class OrgPermission

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


编辑:

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


将我的具体解决方案留给繁荣,因为这是一个棘手的问题:

Type'System.Linq.Enumerable+其中SelectArrayInterator[T..]未标记为可序列化

由于类的字段类型为
IEnumerable
eg:

[Serializable]
class MySessionData{
    public int ID;
    public IEnumerable<int> RelatedIDs; //This can be an issue
}
这里的原因是
Select(…)
返回的具体类,具有不可序列化的类型数据,您需要将id复制到一个新的
列表来解决它

RelatedIDs = nonSerizableList.Select<int>(item => item.ID).ToList();
RelatedIDs=nonSerizableList.Select(item=>item.ID.ToList();

同样重要的是,为什么必须添加可序列化标记:放入会话变量中的任何对象(Int和bools等基本对象除外)都必须标记为可序列化。请注意,某些.NET类在默认情况下不是数据视图。我已将列表类型对象类型存储在
Viewstate
中,当我尝试将其用作中继器控件的数据源时,它显示了相同的错误。它是否也适用于
视图状态
以及
会话状态
?对我不起作用;我认为这是由其他原因造成的。这个错误并不总是出现。但当它发生时,我无能为力。无法重建或保存。我不得不重新启动VS并放松工作。我的web服务器使用的是IIS-7.5,我没有可序列化属性,一旦我移动到IIS-10,我就会出现非序列化错误,有人能告诉我为什么它没有在IIS-7.5上抛出错误吗?我正在将一个类存储到会话密钥中。Not for mode=INPROC找不到您请求的页面。您请求的两个页面都找不到RelatedID是成员(字段),而不是属性。但是谢谢分享这些信息。啊,好地方,谢谢@suncat2000谢谢
.ToList()
解决我的问题。
RelatedIDs = nonSerizableList.Select<int>(item => item.ID).ToList();