J'ai rencontré un problème avec la sérialisation SOAP et il serait intéressant de trouver une réponse. Voici un exemple très simplifié:InvalidOperationException lors de la sérialisation SOAP du type complexe
public void Test()
{
StringBuilder sb = new StringBuilder();
StringWriter writer = new StringWriter(sb);
SoapReflectionImporter importer = new SoapReflectionImporter();
XmlTypeMapping map = importer.ImportTypeMapping(typeof(A));
XmlSerializer serializer = new XmlSerializer(map);
serializer.Serialize(writer, new A());
}
[Serializable]
public class A
{
public A()
{
BB = new B();
}
public int a;
public B BB;
}
[Serializable]
public class B
{
public int A1 { get; set; }
public int A2 { get; set; }
}
Si je cours Méthode d'essai() je reçois l'exception suivante: System.InvalidOperationException: Token StartElement in state Epilog would result in an invalid XML document.
apprécierait toute aide.
Merci, cela aide. Mais j'ai un autre problème, cette fois avec la désertification. Si je substitue la méthode GetHashCode() dans la classe A et essaie d'accéder à la propriété BB, alors NullReferenceException apparaît pendant la désérialisation. D'une manière ou d'une autre, la propriété BB est égale à 0, mais elle ne devrait pas l'être. –
Pouvez-vous poster votre code de désérialisation? Je vais avoir un regard –
Eh bien, j'ai localisé le problème. Le désérialisateur se comporte de manière assez étrange, il crée une nouvelle instance de classe désérialisée (en appelant le constructeur par défaut), après quoi il définit manuellement tous les champs et propriétés à leurs valeurs par défaut. Cela signifie qu'il définit les propriétés de type référence sur null. Et puis deserializator invoque des méthodes comme GetHashCode() et Equals(). Mais mes propres réalisations de ces méthodes "savent" que les propriétés ne seront jamais nulles. Cela a provoqué l'exception. Je viens de changer le code dans GetHashCode() et Equals(), maintenant ils "savent" que les propriétés peuvent être nulles. Merci pour l'aide! –