2011-05-05 79 views
3

部分解決後,昨天(Unable to serialize the session state)的錯誤,我現在遇到這樣一個(同一頁)。無法序列化會話狀態。 2

Server Error in '/' Application. Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

源錯誤:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

堆棧跟蹤:

[SerializationException: Type 'System.Data.Linq.ChangeTracker+StandardChangeTracker' in Assembly 'System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +9452985 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +247 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +160 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +218 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +388 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +133 System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1708

[HttpException (0x80004005): Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.] System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1793 System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34 System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +638 System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item, Stream stream) +244 System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length, Boolean compressionEnabled) +67 System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +114 System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +807 System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs) +184 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1

我現在已經把serializeble型我LINQ的數據庫文件。

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Gebruiker")] 
[Serializable()] 
public partial class Gebruiker { } 

public partial class Gebruiker : INotifyPropertyChanging, INotifyPropertyChanged 
{ 

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); 

    private string _GebruikerID; 

    private string _GebruikerVoornaam; 

    private string _GebruikerNaam; 

    private string _GebruikerEmail; 

    private string _GebruikerWachtwoord; 

    private string _GebruikerPermissies; 

    //... 
} 

回答

4

當使用BinaryFormatter(其包括該會話狀態提供),圖中的所有類型必須經由[Serializable]ISerializable可序列化。這裏最常見的「陷阱」是事件。通常情況下,你可以添加:

[field:NonSerialized] 

任何領域類事件的聲明,即

[field:NonSerialized] 
public event EventHandler FooChanged; 

,但顯然這不是生成的代碼方便。

IMO,真正的問題是在這裏使用豐富的狀態的對象。會話狀態和緩存對象實際上應該是純粹的版本 - 基本的DTO只需要大量的小事和複雜性 - 只需要數據(我認爲完全不變性或冰棒不可變性也是很好的)。我將重構添加一個DTO你想存儲的東西,只是存儲。

另一種方法是改變你的狀態實現,在這個過程中交換的序列化。在DBML設計可以使LINQ模型「單向」,意思是DataContractSerializer將與他們合作;所以DataContractSerializer可能會做出合理的換出;但是寫一個提供商是努力工作與您的業務需求無關。我只想寫的DTO,P

最後一個選項是在你的partial class實施ISerializable,只存/取你實際需要值。

(除事件,任何其他領域,導致不可串行通過BinaryFormatter失敗對象)

相關問題