2013-03-29 14 views
32

Błąd Dostaję jest:Błąd - nie jest oznaczony jako możliwy do serializacji

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

tutaj jest mój kod:

Mam GridView, który wykorzystuje następujące DataSource:

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

ustawić zmienną sesji w moim ładowania strony tak:

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; 

Moja klasa użytkownik wygląda następująco:

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

Nie mogę zrozumieć, dlaczego to łamanie, można go używać bez dokonywania to serializacji?

Próbowałem debugować, a zestaw zmiennych sesji był w porządku, następnie przechodzi do GetOrgList i zwrócił prawidłowe wyniki, ale strona nie ładuje się i otrzymuję błąd powyżej.

Oto fragment mojego GetOrgList funkcji:

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

Odpowiedz

104
[Serializable] 
public class OrgPermission 
+1

który to zrobił. Dziękuję Ci! Chyba wciąż mam sposoby na naukę. –

+11

Równie ważne jest * dlaczego * musisz dodać ten tag serializowalny: dowolny obiekt wstawiony do zmiennej sesji (oprócz obiektów podstawowych, takich jak int i bool) musi być oznaczony jako możliwy do serializacji. Należy zauważyć, że niektóre klasy .NET nie są domyślnie - tj. DataView. – Paul

+0

Zachowałem mój typ obiektu typu List w 'Viewstate' i pokazał mi ten sam błąd, gdy próbowałem użyć go jako DataSource dla kontrolera przemiennika. Czy dotyczy to również 'Viewstate' wraz z' Session State'? – sohaiby

12

Jeśli przechowywać obiekt w stanie sesji, że obiekt musi być możliwy do serializacji.

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


edit:

Aby sesji być szeregowane prawidłowo, wszystkie obiekty w sklepach zastosowanie jako atrybuty sesji musi zadeklarować [Serializable] atrybut. Dodatkowo, jeśli obiekt wymaga niestandardowych metod serializacji, musi także implementować interfejs 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

+0

Nie dla trybu = InProc – Roland

+0

Żądana strona nie została odnaleziona. – JoshYates1980

Powiązane problemy