При использовании BinaryFormatter
(который включает этого провайдера состояния сеанса) все типы в графе должны быть сериализуемы через [Serializable]
или ISerializable
.Самая распространенная «ошибка» здесь - это события.Обычно вы можете добавить:
[field:NonSerialized]
к любым объявлениям событий, подобных полям, т.е.
[field:NonSerialized]
public event EventHandler FooChanged;
, но, очевидно, это не удобно в сгенерированном коде.
IMO,реальная проблема здесь заключается в использовании богатых объектов в состоянии.Объекты состояния сеанса и кеша должны быть на самом деле голыми версиями - базовыми DTO с минимальной суетой и сложностью - просто данными (я бы тоже считал, что иметь полную неизменность или неизменность с помощью эскимо очень приятно),Я бы реорганизовал добавление DTO для вещей, которые вы хотите сохранить, и просто сохраните это.
Другой подход заключается в изменении реализации вашего состояния в процессе замены сериализатора.В конструкторе DBML вы можете сделать модели LINQ «однонаправленными», то есть DataContractSerializer
будет работать с ними;так что DataContractSerializer
может сделать разумный обмен;но написание провайдера тяжелая работа и не имеет ничего общего с потребностями вашего бизнеса .Я бы просто написал DTO; p
Последний вариант заключается в реализации ISerializable
в вашем partial class
и сохранении / извлечении только тех значений, которые вам действительно нужны .
(в дополнение к событиям любые другие поля, которые ведут к объектам, не сериализуемым BinaryFormatter
, будут также давать сбой)