ASP.NET Сервер состояния сеанса - Сохранение Несериализованных данных

StackOverflow https://stackoverflow.com/questions/243110

  •  04-07-2019
  •  | 
  •  

Вопрос

Как вы знаете, в ASP.NET вы можете хранить данные сеанса в одном из следующих трех режимов:

  • Впроц
  • Состояние сеанса
  • SQL Сервер

В режиме InProc вы можете хранить любые объекты данных, даже если они не сериализуемы.Однако в режимах состояния сеанса и SQL Server вы можете хранить только сериализованные данные.

В моем проекте у меня есть готовый портал, который использует режим "InProc" для хранения своего сеанса.Вместо этого мне нужно использовать состояние сеанса из-за некоторых проблем с масштабируемостью и обработкой сбоев.

Проблема в том, что этот портал внутренне хранит несериализованные объекты в контексте сеанса (т. е. Сохраненные объекты не реализуют интерфейс ISerializable).У меня нет доступа к их коду.Есть ли какие-либо обходные пути, чтобы я мог хранить объекты сеанса на сервере состояний без изменения их кода.У меня все еще есть доступ к их файлу web.config, если это каким-либо образом поможет.

Это было полезно?

Решение

AFAIK, простой ответ - нет.Если вы не возражаете изменить свой код, вы могли бы вставить объект-оболочку между фактическим объектом и вашим и заставить вашу оболочку иметь дело с сериализацией обернутого объекта (по сути, как суррогат сериализации) - но к тому времени было бы почти проще просто переписать код...

Что это за объекты?Как правило, объекты для состояния сеанса представляют собой простые классы данных, поэтому не должно возникнуть слишком большой проблемы с их сериализацией?

Другие советы

Сериализация создает представление объекта, которое может быть сохранено и прочитано для воссоздания состояния объекта.

Если объект содержит только типы значений, то вам может не понадобиться реализовывать ISerializable, а понадобится только атрибут [Serializable].

Чтобы сделать этот ответ более полезным или прямым к рассматриваемому вопросу:

Вы не можете сериализовать объект, который каким-либо образом не был выделен как сериализуемый.Любой другой общий способ повторного создания объекта может привести к тому, что объект не будет иметь того же состояния, которое у него было до того, как он был "сериализован".

Как упоминал Марк, вы могли бы сделать это, создав свою собственную сериализуемую "оболочку", но вам нужно было бы быть очень хорошо знакомым с рассматриваемым объектом, и у объекта должны были бы быть методы, которые позволили бы воссоздать его таким образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top