Невозможно сериализовать состояние сеанса. Часть 2 - PullRequest
3 голосов
/ 05 мая 2011

После устранения ошибки вчерашнего дня ( Невозможно сериализовать состояние сеанса ), я теперь сталкиваюсь с этой (на той же странице).

Ошибка сервера в «/» приложении. Невозможно сериализовать состояние сеанса. В режимах «StateServer» и «SQLServer» ASP.NET сериализует объекты состояния сеанса, и в результате несериализуемые объекты или объекты MarshalByRef не допускаются. То же ограничение применяется, если аналогичная сериализация выполняется в пользовательском хранилище состояний сеанса в режиме «Пользовательский». Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Web.HttpException: невозможно сериализовать состояние сеанса. В режимах «StateServer» и «SQLServer» ASP.NET сериализует объекты состояния сеанса, и в результате несериализуемые объекты или объекты MarshalByRef не допускаются. То же ограничение применяется, если аналогичная сериализация выполняется в хранилище состояний пользовательских сеансов в режиме «Пользовательский».

Ошибка источника:

Во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение можно определить с помощью трассировки стека исключений ниже.

Трассировка стека:

[SerializationException: Тип 'System.Data.Linq.ChangeTracker + StandardChangeTracker' в сборке 'System.Data.Linq, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089 'не помечен как сериализуемый.] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (RuntimeType тип) +9452985 System.Runtime.Serialization.FormatterServices.GetSerializableMembers (Тип тип, контекст StreamingContext) +247 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo () +160 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize (Object obj, ISurrogateSelector surrogateSelector, контекст StreamingContext, SerObjectInfoInit serObjectInfoInit, преобразователь IFormatterConverter, ObjectWriter objectWriter, связыватель SerializationBinder) +218 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +388 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (Объект graph, Header [] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Поток serializationStream, граф объектов, заголовки Header [], логический fCheck) +133 System.Web.Util.AltSerialization.WriteValueToStream (значение объекта, средство записи BinaryWriter) + 1708

[HttpException (0x80004005): невозможно сериализовать состояние сеанса. В Режимы StateServer и SQLServer, ASP.NET будет сериализовать сеанс объекты состояния, и, как результат, несериализуемые объекты или Объекты MarshalByRef не разрешены. Применяется то же ограничение если аналогичная сериализация выполняется в хранилище состояний пользовательских сеансов в 'Пользовательский режим.] System.Web.Util.AltSerialization.WriteValueToStream (значение объекта, Писатель BinaryWriter) +1793 System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert (Объект значение, BinaryWriter Writer) +34 System.Web.SessionState.SessionStateItemCollection.Serialize (BinaryWriter писатель) +638 System.Web.SessionState.SessionStateUtility.Serialize (SessionStateStoreData пункт, Поток потока) +244 System.Web.SessionState.SessionStateUtility.SerializeStoreData (SessionStateStoreData item, Int32 initialStreamSize, Byte [] & buf, Int32 & length, Boolean CompressionEnabled) +67 System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive (HttpContext контекст, идентификатор строки, элемент SessionStateStoreData, идентификатор блокировки объекта, логическое значениеnewItem) +114 System.Web.SessionState.SessionStateModule.OnReleaseState (Источник объекта, EventArgs eventArgs) +807 System.Web.SessionState.SessionStateModule.OnEndRequest (Источник объекта, EventArgs eventArgs) +184 System.Web.SyncEp.HttpApplication.IExecutionStep.Execute () +148 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершенный синхронно) +75 Информация о версии: Microsoft .NET Framework Версия: 4.0.30319;ASP.NET версия: 4.0.30319.1

Теперь я поместил сериализуемый тип в мой файл базы данных 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;

    //...
}

1 Ответ

4 голосов
/ 05 мая 2011

При использовании BinaryFormatter (который включает этого провайдера состояния сеанса) все типы в графе должны быть сериализуемы через [Serializable] или ISerializable.Самая распространенная «ошибка» здесь - это события.Обычно вы можете добавить:

[field:NonSerialized]

к любым объявлениям событий, подобных полям, т.е.

[field:NonSerialized]
public event EventHandler FooChanged;

, но, очевидно, это не удобно в сгенерированном коде.

IMO,реальная проблема здесь заключается в использовании богатых объектов в состоянии.Объекты состояния сеанса и кеша должны быть на самом деле голыми версиями - базовыми DTO с минимальной суетой и сложностью - просто данными (я бы тоже считал, что иметь полную неизменность или неизменность с помощью эскимо очень приятно),Я бы реорганизовал добавление DTO для вещей, которые вы хотите сохранить, и просто сохраните это.

Другой подход заключается в изменении реализации вашего состояния в процессе замены сериализатора.В конструкторе DBML вы можете сделать модели LINQ «однонаправленными», то есть DataContractSerializer будет работать с ними;так что DataContractSerializer может сделать разумный обмен;но написание провайдера тяжелая работа и не имеет ничего общего с потребностями вашего бизнеса .Я бы просто написал DTO; p

Последний вариант заключается в реализации ISerializable в вашем partial class и сохранении / извлечении только тех значений, которые вам действительно нужны .

(в дополнение к событиям любые другие поля, которые ведут к объектам, не сериализуемым BinaryFormatter, будут также давать сбой)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...