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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    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 : 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
    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
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    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 : 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 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
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    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 : 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 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

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    Parfait cela vien bien des asseceur publique.
    Cependant toujours un probleme avec cette collection mesScores -_-'

    voila le message d'erreur:
    Une erreur s'est produite lors de la réflexion du type 'System.Collections.Generic.List`1[AP3.Joueur]'
    et voici le code de la classe Enregistre:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <Serializable()> Public Class Enregistre
        Inherits Joueur
        Private mesScores As New Collection
        Private nom As String
     
        Public Sub New()
     
        End Sub
     
        Public Sub New(ByVal unLogin As String, ByVal unMdp As String, ByVal unnom As String)
            MyBase.new(unLogin, unMdp)
            nom = unnom
        End Sub
     
        Public ReadOnly Property ScoresCollec() As Collection
            Get
                Return (mesScores)
            End Get
        End Property
     
        Public Property name() As String
            Get
                Return (nom)
            End Get
            Set(ByVal value As String)
                nom = value
            End Set
        End Property
    et celui de mon chargement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Shared Sub ChargementJoueur()
            Dim MonFichier As Stream
            Dim MaSerial As XmlSerializer
     
            If File.Exists("ObjCollJou.xml") Then
                MonFichier = New FileStream("ObjCollJou.xml", FileMode.Open)
                MaSerial = New XmlSerializer(GetType(Collections.Generic.List(Of Joueur)))
                lesJoueurs = CType(MaSerial.Deserialize(MonFichier), Collections.Generic.List(Of Joueur))
                MonFichier.Close()
            End If
     
        End Sub
    Cette fois ci c'est au lancement... Lorsque je met en comentaire ma collec mesScors et son accesseur, rien ne plante.

  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
    La propriété ScoresCollec ne doit pas être ReadOnly, sinon la sérialisation ne passe pas

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    donc pas d'asseceur pr la collec? ou un asseceur non readonly public?

    Je viens de tester sans avec un asseceur public non readonly avec SET et GET. Meme message.
    Sans asseceur, jen revien au meme probleme, il ne sauvegarde pas ma collection.

  10. #10
    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
    Regarde le détail de l'exception qui est levé, notamment la propriété InnerException (c'est à dire l'exception à l'origine de celle que tu reçois), pour avoir plus de détails

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    {"Une erreur s'est produite lors de la réflexion du type 'AP.Enregistre'."}
    C'est celle ci en l'occurence. Qu'en pensez vous?

  12. #12
    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 titou_777 Voir le message
    C'est celle ci en l'occurence. Qu'en pensez vous?
    Pas encore suffisant... continue à "descendre", regarde la InnerException de la InnerException...

  13. #13
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    Voila en detail le contenu de mon erreur.


    System.invalidOperationException:
    {"Une erreur s'est produite lors de la réflexion du type 'AP3.Joueur'."}
    Data:
    {System.Collections.ListDictionaryInternal}
    Helplink:
    Nothing
    InnerException:
    {"Une erreur s'est produite lors de la réflexion du type 'AP3.Enregistre'."}
    Message:
    "Une erreur s'est produite lors de la réflexion du type 'AP3.Joueur'."
    Source:
    "System.Xml"
    StackTrace:
    " à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel)
    à System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs)
    à System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns)
    à System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel)"
    TargetSite
    {System.Reflection.RuntimeMethodInfo}

  14. #14
    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
    ben c'est toujours pas assez précis pour savoir... il faut descendre jusqu'à trouver un message avec une explication concrète

  15. #15
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    Comment ca descendre encore plus? Je n'ai plus d'arborescence, je ne rien avoir de plus... Dans un autre menu peut etre??

  16. #16
    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
    ben en général quand tu as une erreur comme ça :
    Une erreur s'est produite lors de la réflexion du type 'machin.truc'"
    tu as plus de précisions dans la InnerException... si ce n'est pas le cas, je ne vois pas quoi te dire de plus

  17. #17
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    ok merci quand meme J'ai modifier mon projet, je n'utilise plus de collection de score mais un objet score unique selon le joueur que je mettrai a jour a chaque fois.
    Pas de possibilité d'historisation par contre...

    Voila

  18. #18
    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
    En fait je me demande si ce n'est pas parce que tu utilises une collection non typée : la classe Collection ne donne aucune indication sur le type d'objet qu'elle contient. Il faudrait que tu utilises une List(Of Score) ou quelque chose comme ça.

  19. #19
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 63
    Points : 34
    Points
    34
    Par défaut
    Oui peut etre en utilisan des Collections.Generic.List(Of Joueur).

    Le gros probleme reside en fait dans la serialization d'une collection en tant qu'attribut d'un objet.

  20. #20
    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 titou_777 Voir le message
    Le gros probleme reside en fait dans la serialization d'une collection en tant qu'attribut d'un objet.
    Je vois pas bien ce que tu veux dire... tu peux développer ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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