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

Framework .NET Discussion :

Sérialisation en XML d'objet C# - problème de caractères de contrôle


Sujet :

Framework .NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Sérialisation en XML d'objet C# - problème de caractères de contrôle
    Bonjour,
    Je bute sur un petit problème de sérialisation : l'objet que je doit sérialiser contient des propriétés dont les valeurs sont renseignées par un autre système, via la base de données, ce qui fait que je n'ai aucun contrôle sur les données reçues.
    Il arrive parfois que ces données contiennent des caractères de contrôle (invalides pour la génération du fichier XML) :
    - System.ArgumentException: '', hexadecimal value 0x1F, is an invalid character.

    Si je mets la propriété XmlWriterSettings.CheckCharacters = false, le fichier XML se génère mais le caractère de contrôle est remplacé par  :
    <AdressePatient>Bern-Zürich&#x1F;-Strasse 38</AdressePatient>

    ... et là, la désérialisation ne fonctionne pas non plus pour la même raison citée plus haut.

    Y-a-t-il un moyen de supprimer ces caractères indésirables dans un objet avant la sérialisation ?

    Merci pour votre aide.

    Marc

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    A voir si c'est une possibilité dans ton cas, mais DataContractSerializer est souvent bien plus puissant que XmlSerializer :

    https://msdn.microsoft.com/en-us/library/bb675198.aspx
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Bonjour

    Un contournement est proposé ici, mais il n'est pas "universel" : il impose l'addition d'une propriété pour chaque propriété en CData.

    http://stackoverflow.com/questions/1...-xmlserializer

    A noter que le code dans le setter de l'exemple supra est superflu : la déserialisation de cdata est gérée sans problème par le XmlSerializer.
    Donc, il y a juste le code du getter à faire.
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  4. #4
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Tu pourrai simplement processer ton object avant de le serializer (simple replace) avant de serializer ton object en XML non? Qu'est-ce qui empeche ca?
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Tu pourrai simplement processer ton object avant de le serializer (simple replace) avant de serializer ton object en XML non? Qu'est-ce qui empeche ca?
    Quel intérêt ?
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Citation Envoyé par François M. Voir le message
    Quel intérêt ?
    Avoir un object serializable vers XML?
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    déjà merci pour ces retours ....
    Je ne peux pas vraiment toucher aux objets de notre Framework ...
    Le fait de parser l'objet avant sérialisation m'a titillé l'esprit mais je trouve que ça fait "bricolage" ....
    Je suis en train d'explorer les possibilités du DataContractSerializer, pour le moment j'obtiens le même résultat, c'est-à-dire un fichier XML invalide avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DataContractSerializer s = new DataContractSerializer((Datas.GetType());                    
    using (FileStream fs = File.Open(NomFichierComplet, FileMode.Create))
    {                                                
         s.WriteObject(fs, Datas);
    }
    ... mais je n'ai pas encore trouvé d'option pour enlever les caractères de contrôle

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 218
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Alain Defrance Voir le message
    Avoir un object serializable vers XML?
    Sauf que ça suppose d'avoir un suivi d'état sérialisé/non sérialisé. Il est plus simple d'agir au moment de la sérialisation, AMHA.
    Beaucoup trop d'hommes viennent au monde : l'Etat a été inventé pour ceux qui sont superflus. (Friedrich Nietzsche)

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    re-bonjour,

    J'ai finalement pu trouver une solution non pas à la sérialisation mais à la désérialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false };
    using (XmlReader xmlReader = XmlReader.Create(NomFichierComplet, xmlReaderSettings))
    {
      xmlReader.MoveToContent();
      XmlSerializer xs = new XmlSerializer(TypeClasse);
     
      Objet = xs.Deserialize(xmlReader);
      xmlReader.Close();
    }
    qui permet de relire le fichier XML invalide.

    Merci quand même pour votre aide.

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

Discussions similaires

  1. Problème transformation xml en Objet via xslt
    Par lavoyech dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 24/06/2015, 17h16
  2. Sérialisation et désérialisation de fichier XML en objet
    Par marooned dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 01/08/2012, 10h55
  3. [XStream] Sérialiser un conteneur d'objet java en xml
    Par nitikhor dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 19/03/2012, 18h00
  4. La sérialisation en XML d'un Objet partiellement chargé (JPA)
    Par mesios dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/05/2008, 11h45
  5. Convertir un objet non sérialisable en XML
    Par netdoor.fr dans le forum Persistance des données
    Réponses: 10
    Dernier message: 14/03/2007, 14h08

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