Можно ли сериализовать объекты Linq to sql для состояния сеанса?
-
10-07-2019 - |
Вопрос
Не вдаваясь в подробности, хорошая это или плохая идея:
Можно ли сохранить объект домена LINQ-to-SQL в сеансе ASP.NET, когда сеанс вне процесса?
РЕДАКТИРОВАТЬ] Я в настоящее время получаю следующую ошибку и задал этот вопрос, потому что подозреваю, что объекты LINQ-TO-SQL:
Невозможно сериализовать состояние сеанса.В режимах StateServer и SQLServer ASP.NET сериализует объекты состояния сеанса, в результате чего несериализуемые объекты или объекты MarshalByRef не допускаются.То же ограничение применяется, если аналогичная сериализация выполняется пользовательским хранилищем состояний сеанса в «Пользовательском» режиме.[/РЕДАКТИРОВАТЬ]
например
Session["Zoo"] = new Zoo() {
new Lion(),
new Tiger(),
new Elephant()
}
где:
- Зоопарк, Лев, Тигр, Слон — все они выходят из ZooDataContext.
и файл web.config содержит
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
sqlConnectionString="SqlStateConnectionString"
sqlCommandTimeout="30"
timeout="20"
regenerateExpiredSessionId="true"/>
Решение
Сериализуйте их с помощью datacontractserializer перед сохранением в сеансе или чем-либо еще, что может потребоваться сериализовать... Недавно обсуждалось здесь:
http://social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/81c84ff4-059b-474f-9c69-b8c59027fd48
Другие советы
Чтобы использовать двоичный форматер (например, использование SessionState, я полагаю), вам нужно будет сгенерировать свой код самостоятельно из DBML (я делаю это в настоящее время с шаблоном LINQ2SQL T4).
Следующее необходимо пометить как [NonSerialized]
:
EntityRef
EntitySet
- Все события (для этого вам нужно будет мыслить нестандартно, упражнение для читателя)
Также логику конструктора необходимо переместить в OnCreated
.Вы также должны убедиться OnCreated
вызывается при десериализации, чтобы объект снова мог быть полезен.Это делается с помощью [OnDeserializing]
атрибут.
Я полагаю, что вам нужно будет пометить свои объекты как сериализуемые.Я не уверен, есть ли способ сделать это для всех сгенерированных объектов, но для тех, которые вы помещаете в сеанс, вы можете создать частичный класс (например,Lion) и присвойте ему атрибут Serializable.