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 Presentation Foundation Discussion :

[WPF]Sérializer un System.Windows.Control


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut [WPF]Sérializer un System.Windows.Control
    Bonjour,

    Voilà j'ai créée une classe qui hérite d'un ContentControl "AirportZone", une autre classe "Conveyor" est composé de deux de ces objets. Dans mon application principale, j'ai une liste de AirportZone et de Conveyor, je souhaite sérializer en XML ces deux listes. Pour sérializer un AiportZone je suis obligé de passer par une classe intermédiaire contenant que les données que je souhaite sérializer car il est impossible de sérializer directement un Control.

    Petite question au passage, est-il possible de définir sa propre sérialisation?

    J'ai essayé de créer ma propre sérialisation sur un Conveyor comme ceci:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    [Serializable]
    public class Conveyor : ISerializable
    {
            public Conveyor( )
            {
                  Start = new AirportZone( );
                  End = new AirportZone( );
            }
     
            public Conveyor( AirportZone start, AirportZone end )
            {
                  Start = start;
                  End = end;
            }
     
            public AirportZone Start
            {
                get;
                set;
            }
     
            public AirportZone End
            {
                  get;
                  set;
            }
     
     
            private Conveyor( SerializationInfo info,
                                     StreamingContext ctx)
            {
                  Start.Position = (Point)info.GetValue( "Start", typeof( Point ) );
                  End.Position = (Point)info.GetValue( "End", typeof( Point ) );
            }
     
            void ISerializable.GetObjectData( SerializationInfo info,                   StreamingContext context )
            {
                info.AddValue( "Start", Start.Position );
                info.AddValue( "End", End.Position );
            }
        }
    Mais bon, quand j'essaie de sérializer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    XmlSerializer serializer = new XmlSerializer( typeof( AirportFile ) );
    serializer.Serialize( fs, file );
    J'ai cette exception:
    InnerException = {"Une erreur s'est produite lors de la réflexion du type 'Airport.Controls.Conveyor'."}
    Donc j'imagine, que c'est à cause du fait que dans Conveyor, ses attributs ne peuvent être sérialisable. Donc ce qui veut dire que ma customize sérialisation ne fonctionne pas...

    Je comprends pas trop là...Help please!

    Cordialement,

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    deja tu peux regarder les inner exception pour savoir quel est le type qui ne se serialize pas
    souvent c'est
    - soirt un element qui n'est pas serializable naturelement
    - soit il manque un constructeur vide

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Points : 66
    Points
    66
    Par défaut
    Oui voilà:
    InnerException = {"Une erreur s'est produite lors de la réflexion de la propriété 'Start'."}
    InnerException = {"Une erreur s'est produite lors de la réflexion du type 'Airport.Controls.AirportZone'."}
    InnerException = {"Une erreur s'est produite lors de la réflexion de la propriété 'InputBindings'."}
    Là je viens tout juste d'écrire la sérialisation pour mon AirportZone, il ignore complètement ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            void ISerializable.GetObjectData( SerializationInfo info, StreamingContext context )
            {
                info.AddValue( "Position", Position );
                info.AddValue( "Image", BackgroundImage );
            }

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    je sais pas ce que c'est que ton airport (ca serais sympa de preciser lol)
    mais tu peux pas marquer inpubinding en xmlignore ?

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pourquoi tu essayes de sérialiser 'Airport.Controls.AirportZone' et pas juste les données qui sont contenu dedans (DataContext) ?

  6. #6
    Membre éprouvé Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Points : 998
    Points
    998
    Par défaut
    Hello,

    +1 pour la solution de thomas...

    Par contre, pour sérialiser un contrôle tu peux utiliser les classes (et leurs méthodes statiques) XamlWriter et XamlReader ?

    Sinon, utilise tu peux utiliser le DataContractSerializer de WCF, il est assez simple d'utilisation et marche plutôt bien !

    Bonne soirée,

Discussions similaires

  1. Stretch horizontal sur un System.Windows.Controls.Image
    Par la_urre dans le forum Windows Phone
    Réponses: 2
    Dernier message: 27/07/2011, 16h27
  2. Réponses: 16
    Dernier message: 19/01/2011, 16h42
  3. [WPF]BackgroundImage du System.Windows.Control
    Par Babas007 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 12/10/2010, 22h17
  4. Réponses: 5
    Dernier message: 11/11/2009, 16h01
  5. un control de gestion de systeme windows toute faite
    Par infostars dans le forum ASP.NET
    Réponses: 0
    Dernier message: 04/02/2009, 12h02

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