Impossible de sérialiser l'état de la session... [mise à Jour!]
Je suis en train de stocker des objets dans la session (qui est à l'aide d'un StateServer), mais j'obtiens l'erreur "le Système.Web.HttpException: Impossible de sérialiser l'état de la session. Dans "StateServer" et "SQLServer " mode"
Je sais ce que le message d'erreur signifie, mais je ne peux pas savoir pourquoi. Toutes les classes que j'utilise sont marqués comme Serializable, et je suis capable de Sérialiser et Désérialiser l'objet et à partir de XML à l'aide de:
System.IO.StringReader stringReader = new System.IO.StringReader(xml);
System.Xml.XmlTextReader xmlTextReader = new System.Xml.XmlTextReader(stringReader);
System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(Parts));
Parts obj = ((Parts)(xmlSerializer.Deserialize(xmlTextReader)));
Cela fonctionne, et va Sérialiser ainsi à l'aide de:
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 générée lorsque vous tentez de stocker dans la Session.
Quelqu'un a une idée de ce qui peut être à l'origine de ce comportement?
EDIT:
Je viens de découvrir que cette ligne est à l'origine de l'erreur (après avoir enlevé tout et re-inclus)
///<remarks/>
[System.Xml.Serialization.XmlElementAttribute("RecordReference", typeof(RecordReference), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
[System.Xml.Serialization.XmlElementAttribute("PartContainer", typeof(PartContainer), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public object Item
{
get
{
return this.itemField;
}
set
{
this.itemField = value;
}
}
Si j'ai mis ce "Point" à la propriété "nouvelle RecordReference()", puis l'erreur se produit. Si elle est nulle, c'est la fin.
Alors maintenant, la question est, pourquoi ne peut-on pas StateServer faire face à cela? Il sérialise fine lors de la sérialisation XML...
MODIFIER...
Type De Système.Xml.XmlElement " dans l'Assembly 'System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" n'est pas marqué comme sérialisable.
.....Sommes nous en train de dire que les objets Xml en C# ne sont pas sérialisable?! Quelqu'un d'autre pense que cela confine au fou?
OriginalL'auteur Paul | 2009-08-26
Vous devez vous connecter pour publier un commentaire.
Dans la trace de la pile, vous devriez voir un SerializationException qui indique la classe à laquelle il est impossible de sérialiser...
Note que l'état du serveur utilise la sérialisation binaire pas la sérialisation XML.
Je suis conscient StateServer utilise la sérialisation binaire - sommes-nous dire que la sérialisation binaire ne peut pas sérialiser une propriété de type "objet"?
Je ne pense pas qu'il se soucie le type de la propriété, juste l'objet qui se trouve être assigné (de sorte que vous êtes beaux quand il est de gauche null). Je pense que nous sommes en train de dire que la sérialisation binaire ne peut pas gérer un XmlNode.
OriginalL'auteur stevemegson
Donc, j'ai trouvé la réponse à la question, mais je ne suis pas heureux à ce sujet.
Fondamentalement, certaines des classes que je suis en utilisant contenir XMLElements et XMLNodes (ils sont automatiquement générés à l'aide svcutil). Pour quelque raison que ce soit, mais il pense qu'il a besoin d'eux.
Aucune de ces classes XML sont sérialisables!! Suis-je le seul qui trouve de ce remplir à défaut de ces objets? Donc, pour obtenir cet ensemble de classes dans la session, j'ai pour sérialiser à une chaîne, puis la stocker dans la session, qui est à son tour de la sérialisation. Donc, je suis sérialisation pour être sérialisé.....!?
Pas sûr que je suis heureux avec cela, mais c'était la cause de mes problèmes.
Encore me frustre juste en regardant en arrière, ruddy code 🙂
Viens de tomber sur le même problème, sorte de ammusing que XmlElement n'est pas sérialisable, compte tenu de son juste un conteneur pour XML.
OriginalL'auteur Paul
Ne pas utiliser jamais utiliser InProc. Il est aussi fiable que la météo ou d'un compagnon de chambre de payer leur part du loyer dans les temps. Vous ne savez jamais quand il va tomber juste.
InProc utilise de la mémoire vive disponible de ressources. Il recyclés si la machine a besoin de la RAM ressources pour d'autres tâches plus prioritaires. Si les informations de la session peut durer de 20 minutes ou ce que jamais vous le définissez. Ou ça peut durer 2 minutes lorsque vous êtes enceinte 20. Tout comme le temps, vous ne savez jamais. Il fonctionne tous les grands Dev où la machine n'est pas occupé. Puis vivre, les gens sont libres de trucs hors du panier, parce qu'ils sont accusés de 0 dollars à Paypal.
Si vous allez utiliser des informations de Session, puis l'État du Serveur est le plus simple et sans douleur. Il est presque de preuve de balle aussi. Je l'ai utilisé pendant des années avec zéro problèmes. Vous pouvez reconstruire votre application, déployer et les utilisateurs de ne pas perdre les informations de la session et garder la droite sur comme si rien ne s'était passé. De Plus, vous ne pouvez pas cluster en d'autres serveurs web si vous utilisez InProc. Vous pouvez le faire avec StateServer avec pas de soucis car c'est fait pour ça. Aussi loin que les objets non serializabe, juste l'emballer dans un objet. Par exemple, les tables de données sont non-serializabe mais un ensemble de données est sérialisable.
Vous avez de bons points, mais je ne suis pas sûr de savoir comment ils sont à la question, vu que la question liée à l'utilisation du serveur d'état?
OriginalL'auteur Randall Tomes
pour les objets ou un complexe de classe, alors vous devez ajouter dans votre propre serialision attributs de la classe.
Donc pour MyClass faire quelque chose comme ceci
OriginalL'auteur clatta
La chose la plus importante est de s'assurer que votre site web.config a votre mode d'état de session définie comme 'InProc'. Basé sur le message d'erreur que vous recevez, il suffit de changer cela devrait 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érialisable.
C'était...ce n'est pas une option, j'ai peur
OriginalL'auteur PortageMonkey
Comme stevemegson dit, trouver le cours qui a jeté le SerializationException.
Trouver que "quelque chose" de classe dans votre code et assurez-vous qu'il est sérialisable.
Rendre une classe sérialisable en C#:
Rendre une classe sérialisable en VB.NET:
Pour votre requête spécifique sur la sérialisation XML, voir cet article MSDN:
La Sérialisation XML dans le .NET Framework
OriginalL'auteur andyuk