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.