Erreur n'est pas marqué comme serializable
L'erreur que j'obtiens est:
Type 'OrgPermission' in Assembly 'App_Code.ptjvczom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
voici mon code:
J'ai un gridview, qui utilise la suite de la source de données:
<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>
J'ai défini la variable de session dans mon chargement de la page comme ceci:
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;
Ma classe d'utilisateur ressemble à ceci:
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
}
}
Je ne comprends pas pourquoi c'est la rupture, puis-je l'utiliser sans en faire sérialisable?
J'ai essayé de déboguer, et la variable de session définit très bien, il passe ensuite dans le GetOrgList et retourné des résultats corrects, mais la page ne se charge pas et je reçois le message d'erreur ci-dessus.
Voici un extrait de mon GetOrgList fonction:
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];
}
Vous devez vous connecter pour publier un commentaire.
Viewstate
et il m'a montré la même erreur quand j'ai essayé de l'utiliser comme source de données pour un contrôle repeater. Est-il aussi valable pour lesViewstate
avecSession State
?Si vous stocker un objet dans l'état de session, l'objet doit être sérialisable.
http://www.hpenterprisesecurity.com/vulncat/en/vulncat/dotnet/asp_dotnet_bad_practices_non_serializable_object_stored_in_session.html
edit:
Dans le but de la séance doit être sérialisé correctement, tous les objets de l'application de magasins que les attributs de session doit déclarer l'attribut [Serializable]. En outre, si l'objet qui requièrent des méthodes de sérialisation, il doit également implémenter l'interface 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
Laissant ma solution spécifique pour la prospérité, comme il est délicat version de ce problème:
Type 'System.Linq.Enumerable+WhereSelectArrayIterator[T...] was not marked as serializable
Due à une classe avec un attribut
IEnumerable<int>
par exemple:À l'origine, le problème de l'instance de
MySessionData
a été définie à partir d'un non-sérialisable liste:La cause ici est la classe concrète que l'
Select<int>(...)
retourne, a le type de données qui n'est pas sérialisable, et vous avez besoin de la copie de la carte d'identité pour une nouvelleList<int>
de le résoudre.