it-swarm.com.de

Fehler - ist nicht als serialisierbar gekennzeichnet

Der Fehler, den ich erhalte, ist:

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

hier ist mein code:

Ich habe eine Rasteransicht, die die folgende DataSource verwendet:

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

Ich setze die Sitzungsvariable in meiner Seite wie folgt:

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;

Meine Benutzerklasse sieht so aus:

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
    }
}

Ich kann nicht verstehen, warum es kaputt geht. Kann ich es verwenden, ohne es serialisierbar zu machen?

Ich habe versucht, zu debuggen, und die Sitzungsvariable legt fest, es wird in die GetOrgList geschrieben und es werden korrekte Ergebnisse zurückgegeben. Die Seite wird jedoch nicht geladen und ich bekomme den obigen Fehler.

Hier ist ein Ausschnitt meiner GetOrgList-Funktion:

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];
    }
42
Madam Zu Zu
[Serializable]
public class OrgPermission
121
burning_LEGION

Wenn Sie ein Objekt im Sitzungsstatus speichern, muss dieses Objekt serialisierbar sein.

http://www.hpenterprisesecurity.com/vulncat/de/vulncat/dotnet/asp_dotnet_bad_practices_non_serializable_object_stored_in_session.html


bearbeiten: 

Damit die Sitzung korrekt serialisiert werden kann, müssen alle Objekte, die die Anwendung als Sitzungsattribute speichert, das Attribut [Serializable] deklarieren. Wenn das Objekt benutzerdefinierte Serialisierungsmethoden erfordert, muss es außerdem die ISerializable-Schnittstelle implementieren.

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

16
nimeshjm

Ich lasse meine spezifische Lösung für den Wohlstand, da es eine knifflige Version dieses Problems ist: 

Type 'System.Linq.Enumerable+WhereSelectArrayIterator[T...] was not marked as serializable

Aufgrund einer Klasse mit einem Attribut IEnumerable<int> zB: 

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

Ursprünglich wurde die Probleminstanz von MySessionData aus einer nicht serialisierbaren Liste festgelegt: 

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

Die Ursache ist die konkrete Klasse, die Select<int>(...) zurückgibt, hat Typendaten, die nicht serialisierbar sind , und Sie müssen die IDs in einen neuen List<int> kopieren, um sie zu lösen. 

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