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

VB.NET Discussion :

Nouvel objet - poo - désérialisation


Sujet :

VB.NET

  1. #1
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut Nouvel objet - poo - désérialisation
    Bonjour à tous,

    Je post encore ici à cause de notions de poo qui m'échappent.

    1 -

    Pour prendre un exemple simple et concret :

    Je définis une classe "voiture" dont le but est de fabriquer des voitures de toute sorte, couleur etc...

    Quand l'utilisateur clique sur le bouton "fabriquer une nouvelle voiture", un nouvel objet voiture est créé tel que : Dim voiture_7237 As New Voiture(brake, bleu,...). C'est exactement ce que je coderai. Seulement cette voiture doit être unique et la prochaine fois que l'utilisateur clique sur le bouton, je voudrai que soit créé un nouvel objet tel que : Dim voiture_12910 As New Voiture(berline, noire,...).

    L'utilisateur doit pouvoir créer 200 nouvelles voitures et toutes différentes s'il le souhaite.

    Comment le traduire en code ? comment ne pas nommer un nouvel objet ?

    2 -

    Chaque nouvelle voiture est sérialisée, je stock donc dans un fichier xml ses caractéristiques.

    Mais, comment à la désérialisation récupérer l'objet voiture_12910 pour lui changer sa couleur par exemple ?

    Voila, j'espère être clair. Difficile d'expliquer mon problème ...

    Merci bien

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    très clair sur le 1, après il nous manque le pourquoi de la sérialisation / contexte

    1/
    quand on a plusieurs objets à stocker, il faut utiliser une collection (un tableau en mieux)
    parce qu'on ne va pas déclarer 200 variables, et si on met 200 instances dans une seule, on perd les autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim v as new voiture(break, bleu)
    v = new voiture(berline, rouge)
    à la 2ème ligne, une nouvelle voiture est créée, stockée dans la même variable, mais l'ancienne part dans les oubliettes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim mesvoitures as new list(of voiture)
    dim v as new voiture(break, bleu)
    mesvoitures.add(v)
    v = new voiture(berline, rouge)
    mesvoitures.Add(v)
    mesvoitures.add(new voiture(citadine, verte))
    ici on ajoute 3 voitures dans la collection (ce sont bien les instances, et non les variables qui sont juste des pointeurs)
    avec du linq on peut faire plein de choses sympa genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each v as voiture in (from v2 as voiture in mesvoitures where v2.couleur = bleu)
      ' code
    next
    on peut changer la couleur d'une voiture comme ca : mesvoitures(0).couleur = bleu
    on peut faire parcourir toutes les voitures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for each v as voiture in mesvoitures
      ' code
    next
    pour indexer les voitures autrement que de 0 à n-1, on peut utiliser un dictionary(of T,T2)
    le T sera le type clé permettant de retrouver une instance
    (c'est peu explicite surement , je détaillerais si l'indexation "auto incrément" t'embête et que tu souhaites des accès directs)

    2/
    quand on désérialise ca créé une nouvelle instance, ca ne modifie pas une instance existante
    après rien ne t'empeche à partir de l'instance désérialisée de modifier la version existante selon ce qui est différent puis de laisser l'instance désérialisée aux oubliettes
    la sérialisation est une bonne solution de sauvegarde d'état, je ne suis pas sûr que ca soit adaptée pour gérer des mises à jours d'état pendant l'exécution ...

  3. #3
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Merci pour le point 1, je comprend bien comment construire mon application.
    Un petit point cependant :
    Apres une dé-sérialisation, pour retrouver directement LA voiture que je cherche (2 voitures peuvent être identique), je pense définir dans ma classe voiture un attribut qui sera unique à chaque voiture. Cependant, ça m'oblige à stocker une liste de ces "clés uniques" quelque part ...
    N'existe-t-il pas un autre moyen ? un identifier unique assigné à un objet lors de sa création et qui est stocké lors de la sérialisation ?

    En effet la sérialisation n'est peut être pas adaptée à mon besoin, qui est :

    le coeur de l'application est de créer, gérer des données. Je penses traiter ces données sous forme de liste.
    Il y'aura une liste par objet créé. Cette liste doit pouvoir être modifiée à chaque réouverture du programme.

    Donc l'utilisateur doit pouvoir :
    - créer autant d'objet qu'il le souhaite (une liste est créée automatiquement)
    - A n'importe quel moment, sélectionner un objet et compléter / modifier sa liste.
    - Supprimer un objet.

    Plus j'en parle et plus je me dis qu'il faudrait mieux que j'écrive et gère manuellement les fichier xml... (xml est un choix personnel, il faut juste que ce soit transportable facilement, un avis ?)

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Vous pouvez tout stocker dans un datatable, sauvegarder celui-ci en xml avec les méthodes DataTable.ReadXml et DataTable.WriteXml

    EDIT : Cela ne changera rien au problème présent...

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    donc sur le postulat tu charges tout en ram au démarrage de l'appli et sans base de données (donc mono utilisateur) l'xml convient, c'est pas le plus rapide mais ca peut surement suffire

    sur une base données au aurait fait un identifiant auto incrément, tu peux partir là dessus, mais si tu ne veux pas dupliquer des clés sur des clés supprimées il faudra sauvegader le dernier incrément quelque part (.ini par exemple) ou utiliser un guid

    après un dictionary(of long ou guid, voiture) convient
    tu désérialise au démarrage pour charger le dictionary
    dico(la clé) retournera la voiture

    après pour l'affichage un listbox peut convenir, en mettant les voitures directement dedans et en gérant le displaymember
    ensuite le selecteditem sera une voiture donc tu peux l'utiliser directement

    pour la sauvegarde, si tu pars sur un fichier xml unique (datatable sérialisée) ca oblige à écrire le fichier intégralement à chaque modif, un fichier xml par voiture sera plus rapide

  6. #6
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Merci à tous pour vos contributions. Je vais déjà bosser la dessus.

    Encore merci.

    Cdlt

    Julien

  7. #7
    Membre habitué Avatar de skysee
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 191
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Je reviens vers vous pour un problème de sérialisation.

    Pour reprendre l'exemple des voiture :

    J'ai une classe Garrage et une classe Voiture

    L'utilisateur doit pouvoir créer un nouveau garrage et y ajouter des voiture. Quand l'utilisateur enregistre ou ferme l'application, le garrage et les voitures qu'il contient doivent être sérialisés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <Serializable()> Class Garrage
        Public m_nom_garrage As String
        Public mes_voitures As New List(Of Voiture)
     
        Sub New(nom_garrage As String)
            m_nom_garrage = nom_garrage 
        End Sub
     
        Public Sub ajouter_une_voiture(marque As String, couleur As String, annee As String)
            mes_voitures.Add(New Voiture(marque, couleur, annee))
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <Serializable()> Public Class Voiture
        Public m_marque As String
        Public m_couleur As String
        Public m_annee As String
     
        Sub New(marque As String, couleur As String, annee As String)
            m_marque = marque 
            m_couleur = couleur 
            m_annee = annee 
        End Sub
    End Class
    Puis dans le formulaire :
    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
     
    Dim GarrageMendes As New Garrage("Chez Mendes")
     
        Private Sub ButtonAjouter_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     
            GarrageMendes.ajouter_une_voiture(TextBoxNomVoiture.Text, TextBoxCouleurVoiture.Text, TextBoxAnneeVoiture.Text)
        End Sub
     
        Private Sub ButtonEnregistrer_Click(sender As System.Object, e As System.EventArgs) Handles ButtonEnregistrer.Click
     
            Dim myFileStream As Stream = File.Create("SaveGarrage.xml")
            Dim serializer As New SoapFormatter
            serializer.Serialize(myFileStream, GarrageMendes)
            myFileStream.Close()
        End Sub
    Voila un gros pâté pas très aéré...

    Donc un nouveau garrage est créé puis l'utilisateur rempli ce garrage. Une liste d'objet voiture est remplie via une méthode de la classe Garrage.

    C'est au niveau de la serialisation que ca plante :

    l'erreur est en pointant la ligne : serializer.Serialize(myFileStream, GarrageMendes)
    Le sérialiseur ne prend pas en charge la sérialisation des types génériques
    Voila, merci de votre aide.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    colle ce message d'erreur dans google

Discussions similaires

  1. [POO] Objet json , comment instancier un nouvel objet ?
    Par le_chomeur dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 29/10/2008, 10h19
  2. Créer un nouvel objet dont on ne connait que le type
    Par NicolasJolet dans le forum C#
    Réponses: 1
    Dernier message: 08/02/2007, 09h02
  3. Ajout nouvel objet dans JList
    Par sorry60 dans le forum Composants
    Réponses: 2
    Dernier message: 09/12/2006, 22h37
  4. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 18h53
  5. lier un cube à un objet (POO)
    Par Hypnos dans le forum OpenGL
    Réponses: 12
    Dernier message: 26/08/2003, 21h46

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