私が得ているエラーは次のとおりです:
Type 'OrgPermission' in Assembly 'App_Code.ptjvczom, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
ここに私のコードがあります:
次のデータソースを使用するグリッドビューがあります:
<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];
}
[Serializable]
public class OrgPermission
オブジェクトをセッション状態で保存する場合、そのオブジェクトはシリアル化可能でなければなりません。
編集:
セッションを正しくシリアル化するには、アプリケーションがセッション属性として保存するすべてのオブジェクトが[Serializable]属性を宣言する必要があります。さらに、オブジェクトにカスタムシリアル化メソッドが必要な場合は、ISerializableインターフェイスも実装する必要があります。
この問題のトリッキーなバージョンであるため、繁栄のためにこの特定のソリューションを残します:
Type 'System.Linq.Enumerable+WhereSelectArrayIterator[T...] was not marked as serializable
属性IEnumerable<int>
を持つクラスのため、例:
[Serializable]
class MySessionData{
public int ID;
public IEnumerable<int> RelatedIDs; //This can be an issue
}
もともとMySessionData
の問題インスタンスは、シリアル化できないリストから設定されていました。
MySessionData instance = new MySessionData(){
ID = 123,
RelatedIDs = nonSerizableList.Select<int>(item => item.ID)
};
ここでの原因は、Select<int>(...)
が返す具象クラスシリアル化できない型データを持っているであり、それを解決するにはIDを新しいList<int>
にコピーする必要があります。
RelatedIDs = nonSerizableList.Select<int>(item => item.ID).ToList();