2

インプロセス セッション状態から状態サーバーに移行したいので、現在、ASP.NET v2 アプリケーションを変換してオブジェクトをシリアル化/逆シリアル化しています。これは、私のホスト webhost4life がワーカー プロセスを頻繁にリサイクルする傾向があり、セッション タイムアウトが発生するためです。とにかく...質問...

必要のないものをシリアライズしないようにしています。つまり、各ページで再初期化される変数は、シリアライズする必要はありません。ここにそれらの1つがあります:

(DataServer.Rollback の) 新しいキューとしてのプライベート RollbackQueue

逆シリアル化では、RollbackQueue は a) 何もないか、b) 空のキューになりますか? 私の推測では、.NET がデシリアライズすると、通常どおり親オブジェクトが作成され、フィールドが 1 つずつ埋められます。したがって、NEW ビットが発火します。

しかし、それは推測です。

ありがとう、ロブ。

4

2 に答える 2

3

それは何もありません。CLR シリアル化ロジックは、構築ロジックを実行せずに、 FormatterServices.GetSafeUnitializedObjectによって初期化されていないオブジェクトを作成します。フィールドに値があることを確認する必要がある場合は、そのような初期化を、コンストラクターとOnDeserialized属性Initialize()でマークされたメソッドの両方から呼び出されるメソッドに移動することをお勧めします。

于 2008-09-21T18:32:12.403 に答える
0

簡単なテスト アプリケーションを作成して調べてみませんか? これは私が書いたものです (VB ではなく C# で申し訳ありませんが、現在、VS2008 の C# Express バージョンを開いています)。

[Serializable]
class TestClass
{
    [NonSerialized]
    public Queue<string> queue = new Queue<string>();
}

class Program
{
    static void Main(string[] args)
    {
        var obj = new TestClass();
        Console.WriteLine("Original is null? {0}", obj.queue == null);
        var stream = new MemoryStream();
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, obj);
        stream.Position = 0L;
        var copy = (TestClass)formatter.Deserialize(stream);
        Console.WriteLine("Copy is null? {0}", copy.queue == null);
        Console.ReadLine();
    }
}

これからの出力は

Original is null? False 
Copy is null? True

これで、逆シリアル化すると null になることが確実にわかりました。Kent は別の投稿で、なぜそうなのか、そしてそれに対して何ができるのかを既に説明しているので、ここでは繰り返しません。

于 2008-09-21T18:47:16.687 に答える