2010-01-27 24 views
6

Tôi muốn quấn các biến phiên theo cách tương tự như discussed on CodeProject.Biến có được lưu trong Session deserialized một lần hoặc nhiều lần trong suốt vòng đời của trang không?

public static class WebSession 
{ 
    private const string CurrentUserKey = "CurrentUser"; 

    private static HttpSessionState Session 
    { 
    get { return HttpContext.Current.Session; } 
    } 

    public static bool Exists 
    { 
    get { return Session != null; } 
    } 

    public static User CurrentUser 
    { 
    get { return Session[CurrentUserKey] as User; } 
    set { Session[CurrentUserKey] = value; } 
    } 
} 

Đây là câu hỏi của tôi: nếu tôi có để truy cập CurrentUser nhiều lần trong cùng một trang, tôi sẽ nhận được một cải thiện hiệu suất bằng cách gán nó vào một biến địa phương thay vì truy cập các gói bất động sản? Hoặc không HttpSessionState đảm bảo đối tượng chỉ được deserialized một lần cho mỗi yêu cầu, để các cuộc gọi tiếp theo trong cùng một yêu cầu http không chi phí nữa?

Cảm ơn, Aaron

+0

Không phải là câu trả lời cho câu hỏi của bạn, nhưng sử dụng một biến cục bộ là nhanh hơn sau đó nhận được biến bạn từ một bộ sưu tập. – Canavar

+0

Nếu tôi thêm một số sự liên quan nhiều hơn vào câu hỏi của bạn, "Khi nào việc tuần tự hóa tuần tự và diễn giải tuần tự diễn ra và khi nó diễn ra, tất cả các đối tượng đều được tuần tự hóa/deserialized và nếu tôi gọi cùng một đối tượng phiên (nhiều lần) là nó lấy/deserialized một lần hoặc nhiều lần? – ram

+1

FYI, lớp học của bạn để đối phó với phiên là tốt đẹp.Nếu bạn muốn đưa nó lên một notch, hãy kiểm tra liên kết này: http://blog.theobjectguy.com/2009/12 /session-with-style.html – TheObjectGuy

Trả lời

6

Có một bản sao trong bộ nhớ của nhà nước phiên của bạn trên mỗi yêu cầu. Vì vậy, chi phí duy nhất mà bạn sẽ được tiết kiệm bằng cách sao chép cục bộ một biến phiên là của các diễn viên từ Object để loại của bạn. Bản sao trong bộ nhớ sau đó được thêm vào Phiên ở cuối yêu cầu.

Phiên có được tuần tự hóa và không được tuần tự hóa trên một trang hay không tùy thuộc vào nhà cung cấp phiên mà bạn chọn. Đối với trạng thái phiên trong proc, không có serialization xảy ra. Đối với Session Servers, đối tượng phải được serialize trước.

+0

Serialization là StateServer. Cảm ơn. – devlord

3

Tôi đã thực hiện một số công việc tách phiên recently và từ những gì tôi có thể thấy, toàn bộ đối tượng trạng thái được deserialized một lần và một lần duy nhất theo yêu cầu. Tất nhiên, nó rất dễ dàng để kiểm tra - chỉ cần lấy nó ra hai lần và kiểm tra ReferenceEquals.

Tất nhiên, việc đặt giá trị trong trường giữa các lần sử dụng sẽ tiết kiệm được một số thời gian "tra cứu", nhưng bạn chỉ phải trả chi phí deserialization một lần.

Nếu bạn thực sự muốn đảm bảo, bạn cũng có thể kiểm tra kỹ điều này bằng cách triển khai ISerializable và ghi nhật ký các cuộc gọi tuần tự/deserialize.

4

Có bản sao trong bộ nhớ. Bạn nhận được cải thiện hiệu suất không đáng kể từ bộ nhớ đệm giá trị; nó sẽ chỉ lưu một tra cứu từ điển, mà sẽ là quá nhanh để thông báo trừ khi bạn đang làm nó một tỷ lần mỗi lần tải trang.

Điều quan trọng cần lưu ý là đối với một khóa nhất định, mỗi lần truy xuất trả về một tham chiếu đến cùng một cá thể và phiên cũng giữ tham chiếu. Điều đó có nghĩa, nếu bạn lấy một đối tượng từ Session và sửa đổi nó, bạn không cần gọi lại setter để tái serialize nó.

Tôi chỉ hỏi một câu hỏi về điều này giống nhau: Are .Net property setters ever called implicitly?

+0

Cảm ơn bạn.Tôi đã tìm kiếm trước khi tôi hỏi, tôi hứa! – devlord

+0

Vâng, câu hỏi của tôi đã đến từ một hướng khác. Tôi chỉ đề cập đến nó bởi vì tôi sẽ không mong đợi bạn đã đi qua nó. – Auraseer

Các vấn đề liên quan