Les objets Linq to SQL peuvent-ils être sérialisés pour l'état de la session?
-
10-07-2019 - |
Question
Sans préciser si c'est une bonne ou une mauvaise idée:
Est-il possible de stocker un objet de domaine LINQ-to-SQL dans la session ASP.NET lorsque la session est hors processus ?
[EDIT] J'obtiens actuellement l'erreur suivante et pose cette question parce que je suspecte les objets LINQ-to-SQL:
Impossible de sérialiser l'état de la session. En mode 'StateServer' et 'SQLServer', ASP.NET sérialise les objets d'état de session et, par conséquent, les objets non sérialisables ou les objets MarshalByRef ne sont pas autorisés. La même restriction s'applique si une sérialisation similaire est effectuée par le magasin d'état de session personnalisé en mode "Personnalisé". [/ EDIT]
par exemple
Session["Zoo"] = new Zoo() {
new Lion(),
new Tiger(),
new Elephant()
}
où:
- Zoo, Lion, Tiger, Elephant sont tous issus d'un ZooDataContext
et le fichier web.config contient
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
sqlConnectionString="SqlStateConnectionString"
sqlCommandTimeout="30"
timeout="20"
regenerateExpiredSessionId="true"/>
La solution
Sérialisez-les à l'aide de datacontractserializer avant de les stocker dans une session ou quoi que ce soit d'autre qui pourrait vouloir sérialiser ... Récemment discuté ici :
Autres conseils
Pour utiliser le formateur binaire (comme SessionState, je crois), vous auriez besoin de générer votre code vous-même à partir du DBML (je le fais actuellement avec un modèle Linq2Sql T4).
Les éléments suivants doivent être marqués comme [non sérialisés]
:
-
EntityRef
-
EntitySet
- Tous les événements (pour le faire, vous devez sortir des sentiers battus, faites de l'exercice pour le lecteur)
De plus, la logique du constructeur doit être déplacée vers OnCreated
. Vous devez également vous assurer que OnCreated
est appelé lors de la désérialisation afin que l'objet puisse à nouveau être utile. Cela se fait avec l'attribut [OnDeserializing]
.
Je pense que vous devez marquer vos objets comme étant en série. Je ne sais pas s'il existe un moyen de le faire pour tous les objets générés, mais pour ceux que vous mettez en session, vous pouvez créer une classe partielle (par exemple, Lion) et lui attribuer l'attribut Serializable.