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

ASP.NET Discussion :

Problème de Serialisation: ArrayList dans ArrayList


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut Problème de Serialisation: ArrayList dans ArrayList
    Bonjour à tous et tout d'abord merci pour l'aide que vous apportez au monde du développement (donc à moi :-)).

    Je suis face à un problème sur lequel je galère depuis 2 semaines. Je vais essayer de faire court sans coller 3000 lignes de code...

    J'ai créé un objet appellé DCollection qui implémente la classe KeyedCollection<TKey, TValue> et les 2 interfaces IDictionary<TKey, TValue> et IXmlSerializable.

    Dans cette classe j'ai écrit 2 méthodes qui posent problème pour le cas ou ma collection contient une "sous-collection":

    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
     
    public string ToXml()
            {
                StringBuilder sb = new StringBuilder();
                StringWriter sWriter = new StringWriter(sb);
                XmlSerializer serializer = new XmlSerializer(typeof(List<TValue>));
     
                serializer.Serialize(sWriter, base.Items);
     
                sWriter.Close();
                sWriter.Dispose();
     
                return sb.ToString();
            }
            public string ToXml(Type[] ExtraTypes)
            {
                StringBuilder sb = new StringBuilder();
                StringWriter sWriter = new StringWriter(sb);
                XmlSerializer serializer = new  
     
                XmlSerializer(typeof(List<TValue>),ExtraTypes);
     
                serializer.Serialize(sWriter, base.Items);
     
                sWriter.Close();
                sWriter.Dispose();
     
                return sb.ToString();
            }
    Admettons que mon objet principal que je souhaite sérialiser soit un object de type "DCollection<int,ScheduleSet>" et que chaque objet de type "ScheduleSet" contient un objet de type "DCollection<int,ScheduleSetParam>"
    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
     
     
     [Serializable]
        public class ScheduleSet
        {
            private int _id;
            private string _name;
            private DCollection<int,ScheduleSetParam> _params;
     
            public ScheduleSet()
            {
                _params = new DCollection<int, ScheduleSetParam>();
                _status = new DCollection<int, Status>();
                _status.Add(45, new Status(46, "Test"));
            }
            public ScheduleSet(int id, string name, DCollection<int, ScheduleSetParam> prms)
            {
                Id = id;
                Name = name;
                Params = prms;
            }
            public int Id
            {
                get { return _id;}
                set { _id = value;}
            }
            public string Name
            {   
                get { return _name; }
                set { _name = value; }
            }
            public DCollection<int, ScheduleSetParam> Params
            {
                get { return _params; }
                set { _params = value; }
            }
        }
     
    [Serializable]
        public abstract class ScheduleSetParam
        {
            private int _id;
            private CrystalParam _param;
     
            public abstract object Value
            {
                get;
                set;
            }
            public int Id
            {
                get { return _id; }
                set { _id = value; }
            }
            public CrystalParam Param
            {
                get { return _param; }
                set { _param = value; }
            }
     
        }
    La classe ScheduleSetParam est une classe abstraite dont héritent 3 Classes: IntParam, StringParam et IntParam qui ont bien le flag [Serializable] sur leur tête.

    La serialisation d'un objet "DCollection<int,ScheduleSet>" echoue avec l'erreur
    System.InvalidOperationException: WriteStartDocument doit être le premier appel.
    La serialisation réussit si je rajoute le flag [XmlIgnoreAttribute] devant la propriété "Params" de la classe

    Voici comment je fais appel à ma méthode ToXml():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml_SetParams.DocumentContent = Sess_Schedule.Sets.ToXml(new Type[] { typeof(ScheduleSetParam) });
    Voila j'espère n'avoir rien oublié d'essentiel pour la compréhension de mon problème et vous remercie d'avance pour votre précieuse aide.

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour, tu n'as qu'à utiliser un classe du type SerializableDictionary. Tu as un exemple parmi tant d'autres ici (pour le reste Google est ton ami).

    En espérant t'avoir aidé.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut
    Merci pour ta réponse. En réalité cette solution fut ma première mais vu que le flux XML est systématiquement fusionné avec du XSL, j'avais besoin de noeuds explicites dans mon XML (Ex: "ArrayOfObject" au lieu de "items"). En effet si il y a plusieurs noeuds parents nommés "items", le processeur XSL réagit pas très bien... (il se place au mauvais noeud). Tu vois ou je veux en venir? lol...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    L'attribut [Serializable] contrôle la sérialisation binaire, pas Xml.
    Le problème peut venir du fait que tu as spécifier une classe abstraite dans la sérialisation ScheduleSetParam. Il faut normalement spécifier les classes dérivées avec XmlIncludeAttribute car le sérialiseur ne pourra pas récréer les instances correspondantes.

Discussions similaires

  1. Problème d'affichage d'une ArrayList dans une JSP
    Par Chayton dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 15/03/2015, 01h31
  2. Problème d'ArrayList d'arrayList d'arrayList
    Par Shaina dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 25/02/2011, 11h04
  3. Problème pour opération dans arraylist Integer
    Par bsangoku dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 30/04/2010, 17h40
  4. Problème historisation d'images dans une ArrayList
    Par fcjunic dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/03/2010, 10h25
  5. Des problèmes pour ajouter valeur dans une ArrayList
    Par Fused dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/11/2008, 16h28

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