68

私が得ているエラーは次のとおりです。

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

ここに私のコードがあります:

次の DataSource を使用する 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];
    }
4

3 に答える 3

175

Serializableシリアル化するクラスに属性を追加する必要があります。

[Serializable]
public class OrgPermission
于 2013-03-29T17:03:34.883 に答える
17

オブジェクトをセッション状態で保存する場合、そのオブジェクトはシリアライズ可能でなければなりません。

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

于 2013-03-29T17:19:40.857 に答える