2010-11-12 3 views
4

J'ai la classe suivante:C# problème Désérialisation

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:eu.emsa.ssn")] 
public partial class SSN_ReceiptType { 

    private Header1Type headerField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Order=0)] 
    public Header1Type Header { 
     get { 
      return this.headerField; 
     } 
     set { 
      this.headerField = value; 
     } 
    } 
} 

Et le code XML suivant:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <SSN_Receipt xmlns="urn:eu.emsa.ssn"> 
     <Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/> 
    </SSN_Receipt> 

Et j'utiliser cette méthode typée désérialiser (en appelant Deserialize <SSN_ReceiptType> (xmlGoesHere)) :

/// <summary> 
    /// Deserialize xml string to object of type T 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="xml"></param> 
    /// <returns></returns> 
    public static T Deserialize<T>(string xml) 
    { 
     try 
     { 

      // Create serializer 
      var xs = new XmlSerializer(typeof(T)); 

      // Deserialize 
      T t = (T)xs.Deserialize(new StringReader(xml)); 

      return t; 
     } 
     catch (Exception e) 
     { 
      log.Error(string.Format("Unable to deserialize XML: {0}", xml), e); 

      return default(T); 
     } 
    } 

Maintenant, voici le kicker. Cela avait l'habitude de travailler. Mais récemment, nous avons reçu une nouvelle version du XSD utilisé pour générer les classes, et après avoir créé le nouveau code (qui est inchangé pour cette classe, et vu ci-dessus), je reçois l'exception suivante lorsque vous essayez de désérialiser:

System.SystemException: "Il y a une erreur dans le document XML (1, 57)"

Et en outre:

System.InnerException: < SSN_Receipt 'urne: eu.emsa.ssn' xmlns = > n'était pas prévu.

Que diable? : S J'ai essayé d'ajouter un XmlRootAttribute en spécifiant "SSN_Receipt", cela n'a pas aidé un bit. Quelqu'un sait ce qu'il se passe?

Mise à jour: sections pertinentes du XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ssn="urn:eu.emsa.ssn" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    targetNamespace="urn:eu.emsa.ssn"> 
[...] 
<xsd:element name="SSN_Receipt" type="ssn:SSN_ReceiptType"/> 
[...] 
<xsd:complexType name="SSN_ReceiptType"> 
    <xsd:annotation> 
     <xsd:documentation xml:lang="en"/> 
    </xsd:annotation> 
    <xsd:sequence> 
     <xsd:element name="Header" type="ssn:Header1Type"/> 
    </xsd:sequence> 
</xsd:complexType> 
+2

S'il vous plaît regarder votre langue. Ceci est un forum communautaire. –

+0

Langue supprimée ... –

+0

Quelles sont les différences entre les fichiers xsd? – Kell

Répondre

3

Pour référence future pour d'autres pauvres âmes, voici la solution que je suis venu avec.

Comme mentionné dans ma question, mes classes sont générées à partir d'un XSD. J'ai testé la version précédente de nos cours, et ils fonctionnent très bien. De plus, les services SOAP qui utilisent les mêmes classes fonctionnent également. Inspecter le journal de suivi, je ne vois rien de révélateur en particulier.

Mais j'ai trouvé une solution concrète. J'ai ajouté l'attribut suivant à ma classe:

[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn", 
            ElementName = "SSN_Receipt")] 

Maintenant, je ne veux pas la litière mes classes générées avec un code personnalisé, alors j'ai ajouté une classe partielle:

[System.Xml.Serialization.XmlRoot(Namespace = "urn:eu.emsa.ssn", 
            ElementName = "SSN_Receipt")] 
public partial class SSN_ReceiptType {} 

Cela corrige mon problème complètement. Mais je ne comprends toujours pas pourquoi cela a éclaté en premier lieu.

Si quelqu'un peut trouver une bonne réponse testable pour expliquer pourquoi il s'est cassé, je vais faire de la bonne réponse.

Merci pour votre temps les gars! Cela a été une expérience éducative, dans une certaine mesure :)

+0

Wow, comme c'est étrange: je m'attendrais à ce que xsd.exe génère cet attribut sur votre classe. Eh bien, je vais devoir me souvenir de celui-ci si jamais je rencontre un problème. – Kell

0

Je suis assez sûr que votre xml devrait lire

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ssn:SSN_Receipt xmlns="urn:eu.emsa.ssn"> 
    <ssn:Header StatusMessage="SomethingSomething" StatusCode="Blabla" SSNRefId="N/A" MSRefId="2674762" Version="2.0" To="NCANOHAU1" SentAt="2010-11-12T14:48:44Z" From="SSN"/> 
</ssn:SSN_Receipt> 
+0

les éléments doivent être préfixés avec ssn: – Kell

+0

Merci, va essayer tout de suite – andrerav

+0

Le XML modifié produit maintenant ce qui suit: 'ssn' est un espace de noms non déclaré. Ligne 1, position 57. – andrerav

0

Vous devriez avoir un produit de classe SSN_Receipt. Vous devez utiliser cette classe lorsque vous la passez à la méthode de désérialisation.

IE:

Deserialize<SSN_Receipt>(xmlGoesHere); 

et non la SSN_ReceiptType

+0

Je ne suis pas si sûr - si vous regardez le XSD, le code généré a du sens. Le nom de l'élément est SSN_Receipt, mais le nom de type SSN_ReceiptType. – andrerav

Questions connexes