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

C# Discussion :

forcer l'attribut [Serializable]


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut forcer l'attribut [Serializable]
    Bonjour,

    Peut on en c# forcer une classe à ajouter l'attribut [Serializable] par héritage, implémentation ou autre chose.

    car je cherche à faire ceci et ça risque de planter si T n'a pas l'attribut [Serializable] :
    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
     
        public interface IBase
        {
            void execute();
        }
     
        public class Compute : IBase
        {
            void execute()
            {
            }
        }
     
        public class Work<T> where T : IBase
        {
            private readonly T todo;
     
            internal Work( T todo )
            {
                this.todo = todo;
            }
     
            internal void start()
            {
                this.todo.execute();
            }
     
            internal void save()
            {
                //serialisation binaire,xml ou autre
                // plante si T n'a pas l'attribut [Serializable]
            }
        }

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    A ma connaissance, je ne crois pas que ce soit possible par contre tu peux tester pour savoir si ta classe a bien l'attribut Serializable et là rien de plus simple : http://msdn.microsoft.com/fr-fr/libr...(v=VS.80).aspx

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Dans la mesure ou il s'agit d'un "custom attribut", je pense que celà doit potentiellement etre faisable...

    Il faut regarder des exemples sur l'ajout de Custom Attribut sur des variables et voir si celà est faisable sur une classe en elle-meme...

    Mais dans la mesure ou je crois que celà est faisable sur un membre, pourquoi ne pas le faire sur une classe...

    Une recherche sur internet devrait aider, je pense

    Ici par exemple : http://geekswithblogs.net/abhijeetp/...utes-in-c.aspx
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Salut,
    Pourquoi ne pas plutôt utiliser l'interface ISerializable ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface IBase : ISerializable
    {
        void execute();
        void GetObjectData(SerializationInfo info, StreamingContext context);
    }
    Comme ca tout objet qui implémente IBase doit également implémenter ISerializable ce qui est, si je ne me trompe pas, suffisant pour que les méthodes de sérialisation n'échouent pas. Et donc ca te permet de t'assurer de la contrainte via le where.

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci à tous

    ISerializable était une bonne idée mais ça fonctionne pas.

    Je vais regarder au niveau du Custom Attribut mais c'est bien à la compile qu'il sera utilisé ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dormilon Voir le message
    ISerializable était une bonne idée mais ça fonctionne pas.
    ?
    ça veut dire ?

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    J'ai l'exception suivante :
    Type 'SerializationTest.Compute' in Assembly 'SerializationTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
    Par contre si je rajoute l'attribut [Serializable] à Compute pas d'exception.

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Ah oui ? Je n'aurais pas pensé qu'un type qui implémente ISerializable ne soit pas sérialisable
    C'est quoi le code de sérialisation que tu utilises ? Où se produit l'exception ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par dormilon Voir le message
    J'ai l'exception suivante :
    Type 'SerializationTest.Compute' in Assembly 'SerializationTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

    Par contre si je rajoute l'attribut [Serializable] à Compute pas d'exception.
    Toutes les proprietés de ta classe que tu veux sérialiser, si elles ne sont des types simples, doivent avoir leur type implémenté l'inteface ISerializable ou être décoré de l'attribut Serializable.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    ISerializable permet simplement de faire une sérialisation personnalisée de sa classe mais n'indique absolument pas que cette classe est serializable.

    Pour moi, la solution la plus simple à mettre en place est de vérifier dans sa méthode save si la classe porte l'attribut Serializable.

  11. #11
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2009
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Ah oui ? Je n'aurais pas pensé qu'un type qui implémente ISerializable ne soit pas sérialisable
    C'est quoi le code de sérialisation que tu utilises ? Où se produit l'exception ?
    au moment du BinaryFormatter.Serialize. Je ne passe même pas dans la méthode GetObjectData(SerializationInfo info, StreamingContext context ).

    Citation Envoyé par ostenhard Voir le message
    ISerializable permet simplement de faire une sérialisation personnalisée de sa classe mais n'indique absolument pas que cette classe est serializable.

    Pour moi, la solution la plus simple à mettre en place est de vérifier dans sa méthode save si la classe porte l'attribut Serializable.
    un try/catch suffira mais je voudrai vraiment avoir un contrôle au moment de la compile.


    J'utilise une sérialisation binaire pour le test, je n'ai pas encore défini qu'elle sérialisation j'utiliserai dans mon soft final.
    http://msdn.microsoft.com/fr-fr/libr...=VS.80%29.aspx

    Je trouve vraiment dommage de ne pas pouvoir vérifier à la compile la présence d'attribut ou non. Ou que l'héritage d'une classe avec un attribut ne s'applique pas aux classes filles.

    Je vais donc revoir une partie de mon architecture pour résoudre ce probleme

    Je suis preneur de la moindre idée sinon

Discussions similaires

  1. [JAXB] Forcer l'attribut minOccurs="1" d'un élément
    Par Dolane dans le forum Persistance des données
    Réponses: 0
    Dernier message: 22/09/2010, 12h36
  2. Réponses: 9
    Dernier message: 02/10/2007, 16h12
  3. forcer l'attribut maxlength d'un input text
    Par psychoBob dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/02/2006, 11h39
  4. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22
  5. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53

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