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 :

[Serializalisation] Comment résoudre mon souci d'Héritage et mon format de Date ?


Sujet :

Framework .NET

  1. #1
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut [Serializalisation] Comment résoudre mon souci d'Héritage et mon format de Date ?
    Bonjour,

    2 questions sur la serialisation :

    1) Les dateTime
    Comment faire pour sauvegarder celle-ci sous un format particulier?
    Dois-je mettre la propriété en [XmlIgnore()] et crée une autre propriété qui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public property XmlDate As String
    get 
    return MyDate.ToString(monFormat)
    set (value As String)
    myDate=Date.Parse(value,monFormat)
    end property
    2) l'héritage :
    Je veux sérialiser la classe Train qui comprend un Wagon
    Il existe une classe WagonVoyageur et une autre WagonTransport toutes deux dérivent de Wagon
    Quand je veux serialiser ma classe train je suis Obliger de donner en extraType WagonTransport
    Il y a-t-il un moyen de ne donner que le Type de base dans ce cas Wagon?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    1) Les dateTime
    Comment faire pour sauvegarder celle-ci sous un format particulier?
    Dois-je mettre la propriété en [XmlIgnore()] et crée une autre propriété qui
    Oui, c'est une bonne façon de faire. La sérialisation par défaut pour les dates ne te convient pas ?

    Citation Envoyé par BenoitM Voir le message
    2) l'héritage :
    Je veux sérialiser la classe Train qui comprend un Wagon
    Il existe une classe WagonVoyageur et une autre WagonTransport toutes deux dérivent de Wagon
    Quand je veux serialiser ma classe train je suis Obliger de donner en extraType WagonTransport
    Il y a-t-il un moyen de ne donner que le Type de base dans ce cas Wagon?
    Non, parce que sinon il ne saurait pas le désérialiser...

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Je trouve dommage de devoir indiquer les types.
    Je ne vois pas vraiment pourquoi le framework en a besoin...
    Au pire il pourrait retrouver le type dans sa fonctions...
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Supposons que tu sérialises un WagonTransport qui fait partie d'une liste de Wagon. WagonTransport a peut-être des propriétés qui n'existe pas dans Wagon. Lors de la désérialisation, si le parser rencontre l'une de ces propriétés, il ne saura pas ce que c'est, puisqu'il s'attend à ne trouver que des Wagon... d'où la nécessité de préciser les types dérivés.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Alors la d'accord

    mais vu que dans la Serialisation j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <Wagons>
        <Wagon xsi:type="WagonVoyageur">
            <Id>12345</Id>
            <NbPlace>50</NbPlace>
        </Wagon>
    </Wagons>
    le xsi:type renseigne la classe qui est utiliser donc l'information est quand même moins pertinante mais c'est vrai qu'il n'y a pas tout le chemin complet (nom de l'assembly)?

    Il y a-t-il moyen de supprimer le xsi:type lors de la serialisation?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  6. #6
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    Il y a-t-il moyen de supprimer le xsi:type lors de la serialisation?
    Pas à ma connaissance

  7. #7
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    2) l'héritage :
    Je veux sérialiser la classe Train qui comprend un Wagon
    Il existe une classe WagonVoyageur et une autre WagonTransport toutes deux dérivent de Wagon
    Quand je veux serialiser ma classe train je suis Obliger de donner en extraType WagonTransport
    Il y a-t-il un moyen de ne donner que le Type de base dans ce cas Wagon?
    Oui, c'est possible ! Il existe une technique de sioux que j'ai dénichée au fin fond du net il y a quelques temps de ça, j'étais bien content !

    Il faut "indiquer" les types dérivés dans ton type de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [XmlInclude(typeof(WagonVoyageur)), XmlInclude(typeof(WagonTransport))]
    class Wagon
    {
    ...
    }
    Ainsi, dans ta liste d'objets Wagon, tu peux insérer des objets WagonVoyageur et WagonTransport qui seront sérialisés selon leur propre type.
    Par contre, je pense que du coup les xsi sont obligatoires (à confirmer).

    _______________________
    PS : personnellement, j'ai mis les propriétés en attributs, je trouve ça plus lisible dans une liste. Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Wagons>
        <Wagon xsi:type="WagonVoyageur" Id="12345" NbPlace="50" />
        <Wagon xsi:type="WagonTransport" Id="12346" PoidsMax="500" />
    </Wagons>
    Pour mettre en attribut, c'est tout con, il suffit de rajouter l'attribut Xml suivant devant la propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [XmlAttribute]
    int Id

  8. #8
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Skalp Voir le message
    Il faut "indiquer" les types dérivés dans ton type de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [XmlInclude(typeof(WagonVoyageur)), XmlInclude(typeof(WagonTransport))]
    class Wagon
    {
    ...
    }
    Je crois que c'est justement ça qu'il veut éviter
    Ou alors j'ai rien compris...

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    Merci Skalp le [XmlInclude] marche bien
    et merci aussi à tomlev

    Pour contre oui le but était bien d'enlever le xsi:type (ce qui empêche une Deserialize du fichier) parce que je travaille avec des non informaticiens qui veulent un fichier avec uniquement les informations qui leurs sont utiles même si le tag ne doit rien changer à la lecture vu qu'il faut des lectures manuelle du fichier...
    Mais bon parfois il est plus facile de faire les modifications de son coté que de se battre contre un mur

    Finalement je Serialize mon objet dans un MemoryStream que j'ouvre avec un XmlDocument (ne pas oublier de remettre le pointeur du MemoryStream au début avant de faire le load) où je parcours tous les ChildsNodes pour enlever les attributs xsi:type
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #10
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par BenoitM Voir le message
    Finalement je Serialize mon objet dans un MemoryStream que j'ouvre avec un XmlDocument (ne pas oublier de remettre le pointeur du MemoryStream au début avant de faire le load) où je parcours tous les ChildsNodes pour enlever les attributs xsi:type


    Citation Envoyé par BenoitM Voir le message
    Par contre oui le but était bien d'enlever le xsi:type
    Et une solution dans ce style, ça te conviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Wagons>
        <WagonVoyageur Id="12345" NbPlace="50" />
        <WagonTransport Id="12346" PoidsMax="500" />
    </Wagons>
    Dans ce cas, il faut ajouter XmlArrayItem en attribut de la propriété ou du champ de la liste de wagons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class MaClasse
    {
        [XmlArrayItem(typeof(WagonVoyageur)), XmlArrayItem(typeof(WagonTransport))]
        List<Wagon> Wagons;
    }

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    ah oui c'est joli
    Merci à vous
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/07/2009, 21h18
  2. Réponses: 7
    Dernier message: 10/09/2008, 20h49
  3. Réponses: 2
    Dernier message: 29/09/2006, 09h36
  4. Réponses: 2
    Dernier message: 26/04/2006, 11h19

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