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:
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:
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
Citation:
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:
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.