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 :

désérialisation boolean XML


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut désérialisation boolean XML
    j'ai une classe qui contient une propriété de type Boolean.
    Je désérialise un flux reçu d'un tiers à l'aide d'un objet XmlSerialiser.
    Dans le flux Xml que je reçois la valeur de la propriété Booléenne est "True",
    du coup XmlSerialiser déclenche une exception car il attend "true" (ou "false", tout en minuscule).
    Y-at-il un moyen (peut-être en utilisant les attributs de propriétés) de préciser que la valeur string de ma propriét est insensible à la casse..?
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Non, je ne pense pas que tu puisses lui dire d'ignorer la casse... J'ai regardé les propriétés de XmlElement Attribute, je ne vois rien qui permette de faire ça.
    Mais c'est bizarre, parce que Boolean.ToString renvoie True ou False, avec une majuscule... c'est un peu incohérent.
    Sinon tu peux toujours faire un replace en masse sur ton fichier et passer le résultat au sérialiseur.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    le message renvoyé est :
    La chaîne 'True' n'est pas une valeur Boolean valide
    par contre, si dans le xml je remplace True par true, cela fonctionne et ma propriété est correctement initialisée.
    J'ai essayé en me créant un TypeConverter personnalisé qui hérite du BooleanConverter, cela ne fonctionne pas non plus...
    Etonnant, je te l'accorde....Il m'est compliqué de traiter le cas de manière isolée, j'ai besoin d'abstraction car le flux Xml contient un objet comprenant des dizaines de propriétés étaant elles-même d'autres objets, etc....

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il sort d'où le flux XML que tu essaies de désérialiser ? Tu pourrais pas t'arranger pour qu'il encode les booléens en minuscule ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 3
    Par défaut
    Les objets sont contenus dans des messages envoyés via le protocole HTTP/POST ou par mail. Les messages sont encapsulés dans une enveloppe SOAP/ebXML (ebXML est une norme d'échange de données selon le format XML).
    Le truc est que ce type d'objet peut être envoyé par différents type de clients (en l'occurence des systèmes de réservations) et certains (en fonction de leur système et langage utilisé pour la sérialisation de l'objet) codent leur booléen en "True" et d'autres en "true". je dois bien évidemment avoir un typage d'objet commun.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 156
    Par défaut
    Une solution, si peu de classes sont à modifier seraient de créer son propre type XML de la façon suivante:
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    //Classe a sérialiser
    public class test
        {
            private XML_Bool _a;
     
            //Type XML personnalisé
            public XML_Bool a
            {
                get {
                    if (_a == null)
                    {
                        _a = new XML_Bool();
                    }
                    return _a; }
                set { _a = value; }
            }
     
        }
        public class XML_Bool
        {
            private bool _MyBool;
     
            [XmlText]
            public string MyString
            {
                get 
                {
                    if (_MyBool)
                    {
                        return "True";
                    }
                    else
                    {
                        return "False";
                    }
                }
                set 
                {
                    if (value.ToLower() == "true")
                    {
                        _MyBool = true;
                    }
                    else
                    {
                        _MyBool = false;
                    } 
                }
            }
     
            [XmlIgnore]
            public bool MyBool
            {
                get 
                {
                    return _MyBool;
     
                }
                set 
                {
                    _MyBool = value;
                }
            }
    Cela ne convient pas à Medialog car il à une centaine de classes à modifier.

    En plus mon code n'est pas très joli, joli.

    Quelqu'un auraient d'autres idées?

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/07/2012, 15h50
  2. soucis avec la désérialisation intermediaire xml
    Par estacado dans le forum XNA/Monogame
    Réponses: 6
    Dernier message: 01/10/2009, 16h42
  3. Problème désérialisation XML et binaire
    Par Link3 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 11/07/2008, 11h40
  4. [Axis] Désérialisation XML vers Objet Java
    Par jemini_fr dans le forum Services Web
    Réponses: 2
    Dernier message: 10/12/2007, 14h38
  5. [VB.NET] Désérialiser +xml
    Par olbi dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/10/2007, 10h05

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