0

セッション内に保存したいXMLドキュメントが1つあるため、ポストバックごとに物理パスから再度ロードする必要はありません。ステートサーバーを使用しています。

セッションに保存しようとすると、エラーが発生します。

例外の詳細: System.Runtime.Serialization.SerializationException: Type 'System.Xml.XmlDocument' in Assembly 'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' はシリアル化可能としてマークされていません。

私のコードは次のようなものです:

string resumeSection = string.Empty;

resumeSection = resume.GetXMLSection(1)

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(resumeSection);

Session["USERXML"] = xmloc;

シリアライゼーションを行うには?

エラーの下にある ため、セッション状態をシリアル化できません。'StateServer' および 'SQLServer' モードでは、ASP.NET はセッション状態オブジェクトをシリアル化するため、シリアル化できないオブジェクトまたは MarshalByRef オブジェクトは許可されません。「カスタム」モードのカスタム セッション状態ストアによって同様のシリアル化が行われる場合、同じ制限が適用されます。

4

2 に答える 2

1

オブジェクトをSessionに保存するときは、オブジェクトにマーク[serealizable]を付ける必要があるため、オブジェクトをセッションまたはビューステートに保存する前に、オブジェクトをシリアル化する必要があります。

正直に言うと、複雑な型を実際にセッション状態にするべきではなく、単純な型または軽量のビジネスエンティティのみを格納する必要があります。のようなオブジェクトは格納しないでくださいXmlDocument

最善の方法は、カスタムシリアル化を使用することだと思います。クラスが大きすぎない場合は、XmlDocumentを文字列に永続化して、インスタンスをシリアル化するときにその値を格納することができます。次に、逆シリアル化するときに、SerializationInfoインスタンスからそれをプルするだけです。

ここから簡単なアイデアを得ることができます

この過去のSO投稿もある程度あなたの質問に答えるかもしれません

于 2012-01-19T07:09:38.567 に答える
0

これは 2 年前のことですが、私自身も同じ問題に直面していました。解決策を見つけたので、共有したいと思います。Devjosh の言うとおりです。複雑なオブジェクトをセッションに格納するべきではありませんが、非常に便利な場合があるため、解決策があることを知っておくとよいでしょう。

オブジェクトを xml/dataset/class のように保存すると、このエラーが発生する可能性があることに気付きました。私はそれを汎用オブジェクトとして保存しようとしましたが、うまくいくようです。データセットを保存していた同じコードで、汎用オブジェクトのように保存することでエラーが発生しましたが、正常に動作します。

簡単な例を次に示します。

    public static void InsertSessionObject(string item, object obj)
    {
        HttpContext.Current.Session.Add(item, obj);
    }

    public static object GetSessionObject(string item)
    {
        return HttpContext.Current.Session[item];
    }

    public static void RemoveSessionObject(string item)
    {
        HttpContext.Current.Session.Remove(item);
    }

    DataSet lastResults = GetDatasetResults();

    InsertSessionObject("myDataset", lastResults);

    lastResults = (DataSet)GetSessionObject("myDataset");

    RemoveSessionObject("myDataset");
于 2014-12-09T08:21:35.153 に答える