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

Windows Forms Discussion :

Probleme de Serialization


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Par défaut Probleme de Serialization
    Bonjour, voila j'ai un petit probleme. Je developpe une petite application. A l'interieur j'ai une collection d'objets basiques "Joueur" (appellé lesJoueurs), qui est en fait la classe mere de trois autres classes (admin, invite, enregistre).
    La ou ca coince, c'est qu'au moment de serializer tout ca dans un document XML, il créer bien le document mais ne serialise que les attributs herités e la classe mere (la classe joueur). C'est a dire que tout les attributs specifiques a enregistre ne sont pas present dans le document XML.

    Autre probleme, ma classe enregistre, en plus d'etre une classe fille, a comme attribut une collection. Comment serializer une collection d'une collection s.v.p??


    Voila un extrait de mon code:


    Voila ma serialization:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim MonFichier As Stream
            Dim MaSerial As XmlSerializer
     
            MonFichier = New FileStream("ObjColl.xml", FileMode.Create)
            MaSerial = New XmlSerializer(GetType(Collections.Generic.List(Of Joueur)))
            MaSerial.Serialize(MonFichier, lesJoueurs)
    Voila ma classe Enregistre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Serializable()> Public Class Enregistre
        Inherits Joueur
        Private mesScores As New Collection
        MonFichier.Close()

    L'erreur apparait sur la ligne "MaSerial.Serialize(MonFichier, lesJoueurs)" avec le message suivant:
    "Erreur lors de la génération du document XML. {"Impossible d'effectuer un cast d'un objet de type 'System.Collections.Generic.List`1[AP3.Joueur]' en type 'System.Collections.Generic.List`1[AP3.Enregistre]'."}"
    Voili voilou

    Voila ma classe Joueur (classe mere):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Serializable()> Public Class Joueur
        Private Jlogin As String
        Private Jmdp As String

  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
    Il faut utiliser l'attribut XmlInclude sur la classe Joueur pour indiquer quels sous-types peuvent être sérialisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <XmlInclude(GetType(Enregistre))>
    Public Class Joueur
    Le problème, c'est que dans certains cas la classe de base ne peut pas connaitre toutes les classes dérivées. Il y a une autre façon de faire, moins statique (sans utiliser l'attribut XmlInclude) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim extraTypes as New Type(0)
    extraTypes(0) = GetType(Enregistre)
    MaSerial = New XmlSerializer(GetType(Collections.Generic.List(Of Joueur)), extraTypes)

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Par défaut
    Merci, la serialization fonctionne grase au XMLInclude, cependant... Et oui dsl.
    Lors de la serialization de mes objet-fils de type Enregistre pas exemple, le programme ne serialize que les attributs hérités de la classe mere (Joueur).

    Ma nouvelle, et je pense derniere question, comment faire en sorte qu'il accepte de me serializé mes 2 champs de Joueur ET le champ en plus specifique a Enregistre.

    Merci d'avance

  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
    Citation Envoyé par titou_777 Voir le message
    Lors de la serialization de mes objet-fils de type Enregistre pas exemple, le programme ne serialize que les attributs hérités de la classe mere (Joueur).
    T'es sûr ? j'ai testé avant de poster, chez moi les objets de la classe dérivée étaient correctement sérialisés et désérialisés

    EDIT: ah ok, je vois... la sérialisation XML ne sérialise que les membres publics. Or, mesScores est privé (tout comme Jlogin et Jmdp d'ailleurs )

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Par défaut
    Oui le probleme x'est que Jlogin et Jmdp sont correctement serializés, alors qu'ils sont private. MesScores aussi...

    J'obtient ca dans mon Fichier XML:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" ?> 
      <ArrayOfJoueur xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Joueur xsi:type="Enregistre">
          <Login>aze</Login> 
          <Mdp>aze</Mdp> 
        </Joueur>
      <Joueur xsi:type="Enregistre">
        <Login>seb</Login> 
        <Mdp>seb</Mdp> 
    ...

  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 : 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
    Citation Envoyé par titou_777 Voir le message
    Oui le probleme x'est que Jlogin et Jmdp sont correctement serializés, alors qu'ils sont private. MesScores aussi...
    J'ai pas vu tout ton code, donc je ne sais pas exactement ce qu'il y a dans tes classes... A priori pour les champs Jlogin et Jmdp, tu as des propriétés publics (accesseurs) Login et Mdp. Il faut aussi une propriété publique MesScores dans Enregistre

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

Discussions similaires

  1. postgresql probleme type SERIAL
    Par mapmip dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 09/02/2012, 23h04
  2. Probleme de serialization xml en C#
    Par skay973 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 02/11/2011, 13h39
  3. [EJB3][JBOSS4] probleme de Serialization
    Par bidules dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 08/09/2007, 11h42
  4. probleme avec serialize dans formulaire
    Par shelko dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2007, 11h28
  5. [vb.net] Probleme de serialization
    Par Balbo dans le forum VB.NET
    Réponses: 17
    Dernier message: 03/10/2006, 11h58

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