문제

현재 inproc 세션 상태에서 상태 서버로 전환하고 싶기 때문에 개체를 직렬화/역직렬화하기 위해 ASP.NET v2 응용 프로그램을 수렴하고 있습니다.이는 내 호스트 webhost4life가 작업자 프로세스를 자주 재활용하여 세션 시간 초과를 일으키는 불쾌한 경향이 있기 때문입니다.그래도...질문...

필요하지 않은 것을 직렬화하지 않으려고 노력하고 있습니다.각 페이지마다 다시 초기화되는 변수는 직렬화할 필요가 없습니다.그 중 하나는 다음과 같습니다.

DataServer.Rollback의 새 대기열로 개인 RollbackQueue

역직렬화 시 RollbackQueue는 a) 아무것도 없거나 b) 빈 대기열이 됩니까?내 생각엔 .NET이 역직렬화되면 정상적으로 상위 개체가 생성되고 필드가 하나씩 채워지는 것 같습니다.따라서 NEW 비트가 실행됩니다.

그러나 그것은 추측이다.

고마워요, 롭.

도움이 되었습니까?

해결책

그것은 아무것도 아닐 것이다.CLR 직렬화 논리는 다음을 통해 초기화되지 않은 개체를 생성합니다. FormatterServices.GetSafeUnitializedObject 구성 논리를 실행하지 않고.필드에 값이 있는지 확인해야 하는 경우 해당 초기화를 Initialize() 생성자와 다음으로 표시된 메소드 모두에서 호출되는 메소드 역직렬화됨 기인하다.

다른 팁

알아보기 위해 간단한 테스트 애플리케이션을 작성해 보는 것은 어떨까요?다음은 제가 작성한 것입니다(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는 이미 다른 게시물에서 설명했습니다. 이것이 사실이고 이에 대해 당신이 할 수 있는 일이 있으므로 다시 언급하지 않겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top