Можно ли сериализовать объекты Linq to sql для состояния сеанса?

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

Вопрос

Не вдаваясь в подробности, хорошая это или плохая идея:

Можно ли сохранить объект домена 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.

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