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

Dotnet Discussion :

CodeDomSerializer ne sérialise rien


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut CodeDomSerializer ne sérialise rien
    Bonjour !
    J'ai créé un Designer en utilisant DesignSurface, IDesignerHost, etc...
    Ça fonctionne plutôt bien, seulement j'ai un problème avec un contrôle qui n'est pas sérialisé correctement.

    Admettons le contrôle suivant :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class MonConteneur : UserControl
    {
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public Collection<UnAutreControl> Contient
        {
            get { return _Contient;}
        }
       // ...
    }

    Comme vous le voyez, il contient une collection de contrôles et j'ai posé l'attribut pour indiquer au Designer qu'il faut sérialiser le contenu.
    Seulement voilà, il ne sérialisait pas la propriété Contient.

    J'ai donc créer un type "UnAutreControlCollection" qui hérite de Collection<UnAutreControl> pour pouvoir y ajouter mon propre sérialiseur :
    Code C# : 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class UnAutreControlCollectionSerializer
        : CodeDomSerializer
    {
        public override object Serialize(IDesignerSerializationManager manager, object value)
        {
            UnAutreControlCollection hec = (UnAutreControlCollection)value;                // La collection à sérialiser.
            ExpressionContext ec = (ExpressionContext)manager.Context.Current;        // Le contexte actuel.
     
            // On créer une collection de Statement qui va contenir le résultat de la sérialisation (il n'y en aura qu'un).
            CodeStatementCollection Result = new CodeStatementCollection();
            if(hec.Count == 0) return Result;
     
            // Déclare une variable locale.
            IComponent icmp = (IComponent)ec.Owner;
            CodeVariableDeclarationStatement cvds = new CodeVariableDeclarationStatement(typeof(UnAutreControl), String.Format("hle{0}{1}", icmp.Site.Name, i));
            Result.Add(cvds);
     
            // Pour chaque élément dans la liste on créer un initialiseur.
            int i = 1;
            foreach(UnAutreControl hle in hec)
            {
                // Création d'une nouvelle instance.
                Result.Add(
                    new CodeAssignStatement(
                        new CodeVariableReferenceExpression(cvds.Name),
                        new CodeObjectCreateExpression(
                            typeof(UnAutreControl),
                            new CodeExpression[]{})));
     
                // Sérialise l'hyperlink.
                CodeVariableReferenceExpression cvre = new CodeVariableReferenceExpression(cvds.Name);
                ExpressionContext ecHle = new ExpressionContext(cvre, typeof(UnAutreControl), hec);
                manager.Context.Push(ecHle);
                CodeDomSerializer ItemSerializer = GetSerializer(manager, typeof(UnAutreControl));
                CodeStatementCollection csc = ItemSerializer.Serialize(manager, hle) as CodeStatementCollection;
                object poped = manager.Context.Pop();
                if (csc != null) Result.AddRange(csc);
     
                // Ajoute l'hyperlink à la collection
                Result.Add(new CodeMethodInvokeExpression(ec.Expression, "Add", new CodeExpression[]{ new CodeVariableReferenceExpression(cvds.Name) }));
                i++;
            }
     
            return Result;
        }
    }

    Voilà, ca fonctionne plutôt bien dans le sens où :
    - Ce sérialiseur est bien appelé par la sérialisation de Designer.
    - Le code final obtenu contient bien la déclaration d'une variable, la création de l'instance de UnAutreControl, ainsi que l'ajout de cette instance dans la collection via la méthode Add de celle-ci.

    Sauf que la sérialisation de l'instance de UnAutreControl ne retourne rien.
    C'est à dire que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CodeStatementCollection csc = ItemSerializer.Serialize(manager, hle) as CodeStatementCollection;
    retourne une collection vide alors qu'elle devrait retourner une collection contenant des CodeAssignStatement faisant l'affectation des propriétés du UnAutreControl.

    Je m'y prend mal ? Une idée pour corriger le problème ?

    Merci de votre aide.

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    J'ai trouvé tout seul
    Le problème vient de l'ExpressionContext. Le fait est que je ne passais pas la "PresetValue" alors que dans le contexte actuelle elle doit contenir l'instance de l'objet à sérialiser.

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

Discussions similaires

  1. Sérialisation rien n'ai envoyé à ma Servlet
    Par kevin254kl dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 17/10/2014, 20h12
  2. Réponses: 8
    Dernier message: 04/09/2003, 16h07
  3. Ne rien afficher
    Par rockbiker dans le forum DirectX
    Réponses: 3
    Dernier message: 20/05/2003, 18h02
  4. [debutante] [JDBComboBox]rien à l'affichage
    Par Lina dans le forum JBuilder
    Réponses: 3
    Dernier message: 22/11/2002, 13h31

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