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 :

[.NET 1.1][XmlSerializer] Quid de la Culture?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut [.NET 1.1][XmlSerializer] Quid de la Culture?
    Bonjour,

    J'utilise dans mon projet .NET 1.1 la classe XmlSerializer pour sérialiser et désérialiser des objets en XML et inversement. Ces objets métier contiennent, entre autres, des nombres de type float.

    Des personnes de nationalités différentes peuvent être amenées à utiliser mon application. Même si le problème ne s'est encore jamais posé, mon logiciel n'étant pas encore utilisé à l'international, je subodore un problème embêtant : vu qu'à aucun moment je ne suis capable de forcer la Culture utilisée par le XmlSerializer, ce dernier utilise-t-il l'InvariantCulture par défaut ou suis-je exposé à de futurs problèmes?

    Typiquement, avec une Culture FR, les float seront sauvés avec une virgule, et une Culture EN voudra les lire avec un point.

    D'avance merci pour vos lumières !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    J'ai trouvé ma réponse par ailleurs.

    Le XmlSerializer ne tient pas compte du CurrentCulture mais de la standardisation W3C.

    Je clos le sujet, désolé d'avoir pollué le forum.

  3. #3
    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 : 43
    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
    Citation Envoyé par hobotalker Voir le message
    Je clos le sujet, désolé d'avoir pollué le forum.
    Ce n'est pas de la pollution, c'était une bonne question... d'autres seront sûrement content de trouver la réponse s'ils se posent la même question

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Bonjour,

    Je me permets de réouvrir ce post que j'avais écrit il y a maintenant un moment. Je me confronte à un problème relativement épineux.

    Les fichiers XML envoyés à mon application ont changé : les champs "Length", qui auparavant utilisaient le séparateur "," et considérés comme des chaines de caractères (oui...) sont désormais conformes aux standards W3C : ce sont des champs "double" avec un séparateur ".".

    Je dois donc changer les classes correspondantes dans mon code et y transformer ces champs "string" en champs "double". Sauf que bien entendu, tout le passif (les anciens XML) sont encore utilisés, et la désérialisation ne fonctionne plus sur eux. Il faut pourtant bien que mon application gère à la fois les anciens et les nouveaux formats de fichier. Notez que je refuse de laisser ces champs en "string", vu que c'est tout bonnement dégueulasse.

    Voyez-vous une solution simple à mon problème?

    J'imaginais, avant chaque désérialisation, remplacer tous les "," par des "." dans les champs "Length", mais comment faire? Via Regex, peut-être?
    Une autre idée?

    Merci d'avance pour votre aide !

  5. #5
    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 : 43
    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
    Citation Envoyé par hobotalker Voir le message
    Voyez-vous une solution simple à mon problème?
    Oui, ça
    Tu mets la propriété de type double en XmlIgnore, et tu crées une autre propriété, de type string, qui est utilisée uniquement pour la sérialisation. Par exemple :

    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
    [XmlIgnore]
    public double Length { get; set; }
     
    [EditorBrowsable(EditorBrowsableState.Never)] // pour ne pas l'afficher dans l'intellisense
    [XmlElement("Length")] // Ou XmlAttribute, selon ce que tu veux
    public string LengthXML
    {
        get
        {
            return Length.ToString(CultureInfo.InvariantCulture);
        }
        set
        {
            if (string.IsNullOrEmpty(value))
                Length = 0.0;
            else
                Length = double.Parse(value.Replace(',', '.'), CultureInfo.InvariantCulture);
        }
    }

    Citation Envoyé par hobotalker Voir le message
    J'imaginais, avant chaque désérialisation, remplacer tous les "," par des "." dans les champs "Length", mais comment faire? Via Regex, peut-être?
    Pas besoin de Regex pour un truc aussi simple, String.Replace fait très bien l'affaire

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2003
    Messages : 160
    Par défaut
    Salut tomlev,

    Alors, laisse-moi juste quelques secondes pour halluciner.
    (...)
    Ok, c'est bon.

    C'est exactement ce dont j'ai besoin ! Je me doutais qu'il y avait un p'tit trick possible vie les getter et setter, et je commençais à fouiller dans ce sens. Le seul minuscule petit défaut qu'on peut trouver est le fait que dans l'absolu, le code applicatif peut utiliser LengthXML alors qu'il ne faut surtout pas. Autant dire que je suis largement près à faire cette concession pour que mes milliers de fichiers passent sans broncher Je me voyais déjà écrire une moulinette pour aller taper dans le passif et remplacer toutes les virgules par des points. Berk !
    C'est juste parfait !

    NB: dans une hypothèse pré-désérialisation, le string.Replace ne fait pas l'affaire quand tu veux, sur un immense random texte, remplacer les "," par des "." dans des valeurs encore inconnues des attributs Length

    Excellent week-end à toi, et encore merci !

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

Discussions similaires

  1. Changer la culture pour un nouveau process non .net
    Par AKsha dans le forum Framework .NET
    Réponses: 0
    Dernier message: 22/06/2011, 16h57
  2. [ASP.Net - Culture] - Migration Framework 1.1 vers 3.5
    Par Anto03 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 02/11/2009, 14h56
  3. [ASP.NET 2.0] Export Excel file modifier la culture
    Par fix105 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 13/02/2008, 16h10
  4. .net , oui, mais QUID de win98, 2000, ME ou NT.?
    Par eomer212 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 26/01/2007, 00h22
  5. [ServiceWindows][VB.NET] Forcer la culture
    Par lutecefalco dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/10/2005, 17h30

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