IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Sérialisation XML impossible


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut Sérialisation XML impossible
    Bonjour,

    j'ai un soucis de sérialisation XML.

    à la base, j'ai un fichier XSD, duquel j'ai généré les classes correspondantes avec l'outil Xsd2Code.

    Voilà l'objet qui pose souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
        public partial class ReferenceAbsolue {
     
            private List<ReferenceAbsolueInit> initField;
     
            //...
     
            public ReferenceAbsolue() {
                //...
                this.initField = new List<ReferenceAbsolueInit>();
            }
     
            public List<ReferenceAbsolueInit> Init {
                get {
                    return this.initField;
                }
                set {
                    this.initField = value;
                }
            }
        }
     
        public partial class ReferenceAbsolueInit {
     
            private int zoneField;
     
            private double valueField;
     
            public int Zone {
                get {
                    return this.zoneField;
                }
                set {
                    this.zoneField = value;
                }
            }
     
            [System.Xml.Serialization.XmlTextAttribute()]
            public double Value {
                get {
                    return this.valueField;
                }
                set {
                    this.valueField = value;
                }
            }
        }
    Et donc à l’exécution, lorsque je veux sérialiser mon fichier xml, j'obtiens une erreur :
    System.InvalidOperationException : Une erreur s'est produite lors de la réflexion du type 'ReferenceAbsolueInit'. Changez le type du membre XmlText 'ReferenceAbsolueInit.Value' de System.Double en chaîne ou tableau de chaines.
    ça vient de l'objet List<> ??
    Comment ça se fait qu'il ne veut pas de double?...

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Je pense que le problème vient plutôt du fait que tu utilises l'attribut [System.Xml.Serialization.XmlTextAttribute()].

    Si tu l'enlèves, ça fonctionne ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Ah oui, ça marche, merci!

    Bizarre, parce que cet attribut avait été généré par l'outil...


    Bon, après j'ai une autre erreur, faut que je regarde ça de plus près...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Donc maintenant, c'est cet objet qui pose souci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
        public partial class Regroupements {
     
            private int nB_zonesField;
     
            private List<Tableau> table_zonesField;
     
            public Regroupements() {
                this.table_zonesField = new List<Tableau>();
            }
     
            public int NB_zones {
                get {
                    return this.nB_zonesField;
                }
                set {
                    this.nB_zonesField = value;
                }
            }
     
            [System.Xml.Serialization.XmlArrayAttribute(Order=1)]
            [System.Xml.Serialization.XmlArrayItemAttribute("Zone", IsNullable=false)]
            public List<Tableau> Table_zones {
                get {
                    return this.table_zonesField;
                }
                set {
                    this.table_zonesField = value;
                }
            }
        }
    l'erreur est la suivante :
    System.InvalidOperationException : Mise en séquence incohérente : si la propriété 'Order' est utilisée dans l'un des membres de la classe, elle est requise pour tous les membres de type partie. Définissez 'Order' de manière explicite via l'attribut personnalité XmlElement, XmlAnyElement ou XmlArray dans le membre de classe 'NB_zones'.
    Je vois pas trop où il veut en venir...
    sorry, j'y connais pas encore grand chose en sérialisation...

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Le message d'erreur est assez explicite pourtant Si tu utilises la propriété "Order" pour l'un des éléments, alors tu dois l'utiliser de partout. En l'occurence, il est utilisé sur la propriété Table_zones.

    Donc tu as deux solutions : soit tu le laisses, et dans ce cas tu dois le rajouter de partout au sein de la classe, soit tu l'enlèves.

    [EDIT] : Pour apprendre, n'hésite pas à jeter un oeil sur La sérialisation XML avec .NET
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Oui, j'ai bien compris ça
    mais à quoi sert cet attribut? (c'est encore un truc généré par l'outil...)

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Ahh ces outils...

    Le Order te permet de définir la séquence de sérialisation/déserialisation. Si tu décides de l'utiliser, il faut l'utiliser sur chacune des propriétés incluses dans le processus de sérialisation.

    Dans ton cas, tu ne l'avais défini que sur Table_zones, et pas sur NB_zones, donc le moteur de sérialisation en savait pas dans quel ordre procéder (ie. faut-il traiter NB_zones avant ou après Table_zones ?).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Ahh ces outils...
    c'est clair!!

    il m'a l'air d'être plein de bug...

    il me fout des XmlTextAttribute partout qui foutent la grouille...

    Là, je sais pas pourquoi il me met un 'order'...
    ppfffffff, faut tout reprendre quoi...


    Merci pour le lien, il était ouvert dans l'onglet d'à côté justement


    Bon, j'ai réussi à supprimer tout ça...
    mais j'ai encore une exception à la validation de mon fichier xml... ça me dit que c'est pas valide mais j'en sais pas plus... génial quoi...

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    mais j'ai encore une exception à la validation de mon fichier xml... ça me dit que c'est pas valide mais j'en sais pas plus... génial quoi...
    C'est quoi le message d'erreur exact ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    ça me met :
    System.InvalidOperationException - Il existe une erreur dans le document XML (2,2).
    est-ce que ça veut dire que l'erreur est à la liste 2, 2ème caractère??
    sachant que c'est la balise entrante de mon fichier...

  11. #11
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Peux-tu poster le contenu de l'InnerException ? Ainsi que le début du fichier XML, histoire qu'on puisse voir la partie mentionnée dans l'InnerException.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Alors il doit lui manquer un bout de l'en-tête

    voilà le début de mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version='1.0' encoding='utf-8' ?>
    <Parametres xmlns='urn:schemaParam'>
    ...
    </Parametres>
    et l'inner exception :
    System.InvalidOperationException : <Parametres xmlns='urn:schemaParam'> n'était pas attendu.
    ...

  13. #13
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    OK je pense que le problème vient de la valeur de l'attribut XML "xmlns"...

    Sur ta classe Parametres, rajoute l'attribut suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "X", IsNullable = true)]
    class Parametres
    {
        // ...
    }
    Ensuite lorsque tu fais la sérialisation, utilises quelque chose comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var namespace = new XmlSerializerNamespaces();
    namespace.Add("", "X");
     
    // xs est ton serialisateur
    xs.Serialize(xmlTextWriter, Toto, namespace);
    Il faut que le contenu de X soit le même dans les deux cas. Tu peux mettre quelque chose du genre "http://tonsite.com/api/v1.0" par exemple...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Bon, en fait, j'avais oublié une option pour la génération de mes classes
    et c'est bon, tout marche maintenant!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C# 2.0] Sérialisation XML avec PCDATA
    Par stailer dans le forum C#
    Réponses: 2
    Dernier message: 07/01/2007, 22h52
  2. [KPL] Fichier xml impossible a ouvrir
    Par kurt212 dans le forum Autres langages
    Réponses: 4
    Dernier message: 05/11/2006, 17h13
  3. Problème sérialisation XML [C#]
    Par AlphonseBrown dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 22h58
  4. [Maven 2] Parsing XML impossible
    Par morice.ju dans le forum Maven
    Réponses: 1
    Dernier message: 20/04/2006, 12h00
  5. [VB.NET] Sérialisation XML de Collections
    Par nico-pyright(c) dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/12/2004, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo