Impossible de sérialiser l’état de la session…

J’essaie de stocker des objects dans la session (qui utilise un StateServer), mais le message d’erreur “System.Web.HttpException: impossible de sérialiser l’état de la session. En mode” StateServer “et” SQLServer “”

Je sais ce que le message d’erreur signifie, mais je ne peux pas comprendre pourquoi. Toutes les classes que j’utilise sont marquées en tant que Serializable et je peux sérialiser et désérialiser l’object vers et depuis XML à l’aide de:

System.IO.SsortingngReader ssortingngReader = new System.IO.SsortingngReader(xml); System.Xml.XmlTextReader xmlTextReader = new System.Xml.XmlTextReader(ssortingngReader); System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(Parts)); Parts obj = ((Parts)(xmlSerializer.Deserialize(xmlTextReader))); 

Cela fonctionne et se sérialisera aussi en utilisant:

 System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(this.GetType()); System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); xmlSerializer.Serialize(memoryStream, this); memoryStream.Seek(0, System.IO.SeekOrigin.Begin); System.IO.StreamReader streamReader = new System.IO.StreamReader(memoryStream); return streamReader.ReadToEnd(); 

Mais l’erreur est renvoyée lorsque vous essayez de la stocker dans la session.

Quelqu’un a-t-il une idée de ce qui peut être à l’origine de ce comportement?

MODIFIER:

Je viens de découvrir que cette ligne est à l’origine de l’erreur (après avoir tout supprimé et ré-inclus)

 ///  [System.Xml.Serialization.XmlElementAtsortingbute("RecordReference", typeof(RecordReference), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] [System.Xml.Serialization.XmlElementAtsortingbute("PartContainer", typeof(PartContainer), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)] public object Item { get { return this.itemField; } set { this.itemField = value; } } 

Si je définis cette propriété “Item” à “new RecordReference ()”, alors l’erreur se produit. Si c’est nul, c’est bien.

Alors maintenant, la question est: pourquoi le StateServer ne peut-il pas faire face à cela? Il sérial bien lors de la sérialisation au format XML …

MODIFIER…

Le type ‘System.Xml.XmlElement’ dans Assembly ‘System.Xml, Version = 2.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089’ n’est pas marqué comme sérialisable.

….. Sommes-nous en train de dire que les objects Xml en C # ne sont pas sérialisables?! Est-ce que quelqu’un d’autre pense que cela frise le fou?

Dans la trace de la stack, vous devriez voir une SerializationException qui indiquera quelle classe il est incapable de sérialiser …

 [SerializationException: Type 'SomethingOrOther' in Assembly 'SomethingElse' ... 

Notez que le serveur d’état utilise la sérialisation binary et non la sérialisation XML.

J’ai donc trouvé la réponse à la question, mais je n’en suis pas content.

En gros, certaines des classes que j’utilise contiennent XMLElements et XMLNodes (ils sont générés automatiquement à l’aide de svcutil). Pour une raison quelconque, mais il pense qu’il en a besoin.

Aucune de ces classes XML n’est sérialisable !! Suis-je le seul à trouver que cela est un échec total de ces objects? Donc, pour obtenir cet ensemble de classes dans la session, je dois les sérialiser en une chaîne, puis les stocker dans la session, qui les sérialise à son tour. Donc, je le sérialise pour qu’il soit sérialisé …..!?

Pas sûr que je sois heureux avec ça, mais c’était la cause de mes problèmes.

Ne pas utiliser jamais utiliser InProc. Il est aussi fiable que la météo ou qu’un colocataire paie sa part du loyer à temps. Vous ne savez jamais quand il va simplement laisser tomber.

InProc utilise les ressources de RAM disponibles. Il sera recyclé si la machine a besoin de ressources en RAM pour d’autres tâches plus prioritaires. Ainsi, les informations de la session peuvent durer 20 minutes ou ce que vous préférez. Ou cela pourrait durer 2 minutes si vous vous attendez à 20. Tout comme le temps qu’il fait ne sait jamais. Tout fonctionne très bien dans Dev où la machine n’est pas occupée. Ensuite, en direct, les gens obtiennent des trucs gratuits en dehors du panier d’achat car ils sont facturés 0 dollars à Paypal.

Si vous allez utiliser les informations de session, alors State Server est le moyen le plus simple et le plus simple. Il est presque à l’épreuve des balles aussi. Je l’utilise depuis des années avec zéro problème. Vous pouvez reconstruire votre application, la déployer et les utilisateurs ne perdent pas les informations de la session et continuent comme si de rien n’était. De plus, vous ne pouvez pas vous connecter à d’autres serveurs Web si vous utilisez InProc. Vous pouvez avec StateServer sans tracas car il est fait pour cela. En ce qui concerne les objects non sérialisables, il suffit de les envelopper dans un object. Par exemple, les DataTables ne sont pas sérialisables, mais un DataSet est sérialisable.

pour des objects ou une classe complexe, vous devez append vos propres atsortingbuts de série à la classe.

Donc pour MyClass faire quelque chose comme ça

 [Serializable] public class MyClass : ISerializable { bool TorF=true; ssortingng str="Save me"; public MyClass() {//need a constructor for your access} #region Serialisation //read in data public MyClass(SerializationInfo info, StreamingContext context) { TorF=(bool)info.GetValue("TorF",typeof(bool)); str=(ssortingng)info.GetValue("str",typeof(ssortingng)); } //write out data public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("TorF", TorF); info.AddValue("str", str); } } 

La chose la plus importante est de vous assurer que votre mode d’état de session est défini sur ‘InProc’ dans votre Web.config. En fonction du message d’erreur que vous recevez, il suffit de le modifier pour résoudre le problème. Si vous rencontrez toujours des problèmes, assurez-vous que tous les événements sont marqués comme non sérialisables.

Comme l’a dit stevemegson, découvrez quelle classe a lancé la SerializationException.

 [SerializationException: Type 'SomethingOrOther' in Assembly 'SomethingElse' ... 

Recherchez la classe “SomethingOrOther” dans votre code et assurez-vous qu’elle est sérialisable.

Rendre une classe sérialisable en C #:

  [Serializable]_ public class PayeeData { ... } 

Rendre une classe sérialisable dans VB.NET:

   _ Public Class PayeeData ... End Class 

Pour votre requête spécifique sur la sérialisation XML, consultez cet article MSDN:

Sérialisation XML dans le .NET Framework