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

Services Web Discussion :

IEnumerable et sérialisation


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut IEnumerable et sérialisation
    Bonjour,

    C'est la première fois que j'envoie a un WS un objet et je dois lui envoyer un objet de mon cru appelé "RecordSet" dont vous trouverer la déclaration ci dessous. Cette classe est contenue dans une librairie appelée MDA, et est partagée par le client et le webservice.


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
        [Serializable]
        public class RecordSet : IEnumerable
        {
            #region Propriétés
            public Device LocalDevice { get; set; }
            public DateTime RecordingDay { get; set; }
            public List<Record> RecordList { get; set; }
            #endregion
     
     
            #region Indexeurs
     
            public Record this[int i]
            {
                get
                {
                    return RecordList[i];
                }
                set
                {
                    RecordList[i] = value;
                }
            }
     
            #endregion
     
            #region Constructeurs
     
            public RecordSet()
            {
                RecordingDay = DateTime.Now;
                LocalDevice = new Device();
                RecordList = new List<Record>();
            }
     
            public RecordSet(DateTime dt, Record[] list)
            {
                RecordingDay = dt;
                LocalDevice = new Device();
                RecordList = new List<Record>(list);
            }
            #endregion
     
            #region IEnumerable Membres
     
            IEnumerator IEnumerable.GetEnumerator()
            {
                return new RecordSetEnum(RecordList);
            }
     
            #endregion
        }
     
        public class RecordSetEnum : IEnumerator, IDisposable
        {
            private List<Record> _list;
            private int _position;
     
            #region Constructeurs
     
            public RecordSetEnum(List<Record> list)
            {
                _list = list;
                Reset();
            }
            #endregion
     
            #region IEnumerator Membres
     
            public Record Current
            {
                get { return _list[_position]; }
            }
     
            public bool MoveNext()
            {
                return (++_position < _list.Count);
            }
     
            public void Reset()
            {
                _position = -1;
            }
     
            object IEnumerator.Current
            {
                get { return _list[_position]; }
            }
     
            #endregion
     
            #region IDisposable Membres
     
            public void Dispose()
            {
                return;
            }
     
            #endregion
        }
    La génération de la classe ainsi que celle du ws se déroule sans erreur. Lors de l'exécution du WS j'ai une erreur ainsi que la trace du serveur de dev, que je n'arrive pas a m'expliquer

    Pour être sérialisables XML, les types qui héritent de IEnumerable doivent avoir une implémentation de Add(System.Object) à tous les niveaux de leur hiérarchie d'héritage. MDA.RecordSet n'implémente pas Add(System.Object).
    Dès que je supprime la déclaration IEnumerable ainsi que la définition des méthodes membre dans la classes RecordSet, l'application se compile et s'exécute sans problème.

    Merci a vous

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Dans un web service, tes méthodes doivent retourner des Collection<T>.

    Le IEnumerable n'ayant pas de méthode Add, peut être sérialisé mais pas désérialisé en SOAP.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Je ne comprend pas

    Je ne souhaite pas que web methode retourne une collection, elle doit recevoir un objet qui contient un collection<T>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [WebMethod (Description="Put some record in the service database", EnableSession=true)]
    public void PushASet(RecordSet rs)
    {
       //blabla
    }
    Je suppose que tu veux dire que .net ne sait pas désérialiser la collection contenue dans mon objet RecordSet ? Alors comment faire ?

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Même motif, même punition

    La serialisation SOAP est une sérialisation XML, ce n'est pas un problème .Net.

    Elle n'opére que sur les propriétés publiques, accessible en get/set.

    Donc, un objet qui expose un IEnumerable (qui n'est par définition pas "reconstituable" à la désérialisation puisque qu'on ne peut pas "réinjecter" les données dedans) n'est pas compatible SOAP.

    Donc, sauf à créer un sérialiseur spécifiqe (ce qui suppose que tu ais la main à la fois sur le service et le client et que tu ne souhaites pas que ton service soit connectable par des clients "lambdas"), tu ne peux pas utiliser cela.

    Et si tu dois faire un serialiseur spécifique, dans cas SOAP perd beaucoup d'interêt, et autant utiliser un mode d'échange plus performant.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Je suis bien dans le cas où j'ai la main sur le client et le service.

    Ok, je comprends mon erreur. Je vais donc devoir parcourir mes boucles avec les indexeurs plutot que foreach.

    Dans le cas ou je persisterai a vouloir implémenter IEnumerable, ma classe devrait implémenter les méthodes de IXmlSerializable et m'amuser a redéfinir ReadXml et WriteXml, et c'est là que SOAP perd de son interet.

    Merci

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par GloRex Voir le message
    Ok, je comprends mon erreur. Je vais donc devoir parcourir mes boucles avec les indexeurs plutot que foreach.
    Euh ... là je ne vois pas le rapport, désolé.

    Dans le cas ou je persisterai a vouloir implémenter IEnumerable, ma classe devrait implémenter les méthodes de IXmlSerializable et m'amuser a redéfinir ReadXml et WriteXml, et c'est là que SOAP perd de son interet.

    Merci
    Tout à fait.

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

Discussions similaires

  1. [Sérialisation] d'objets de types différents
    Par Amnesiak dans le forum Général Java
    Réponses: 3
    Dernier message: 08/12/2004, 22h28
  2. [Sérialisation] StackOverFlowError levée
    Par ptitjack dans le forum Général Java
    Réponses: 9
    Dernier message: 04/11/2004, 13h27
  3. [Serializable][image] Sérialiser une image
    Par Galima dans le forum Graphisme
    Réponses: 7
    Dernier message: 01/07/2004, 18h12
  4. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24
  5. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18

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