Bonjour,
Durant la désérialisation d'un objet, il est nécessaire que j'ajoute des éléments dans un de ses membres de type Dictionary.
Je procède comme suit dans le constructeur :
- je désérialise le Dictionary à partir des informations de sérialisation.
- j'ajoute un élément
Une exception est levée à ce moment dans
System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
En examinant l'état du Dictionary, je constate qu'après sa désérialisation, la propriété Count est égale à zéro alors qu'un certain nombre d'éléments devraient déjà s'y trouver.
Si je laisse se dérouler normalement la désérialisation, sans tenter d'ajouter un élément, le Dictionary est complet, on y retrouve son contenu original.
J'en conclu que le Dictionary se trouve dans un état "bloqué" tant que la désérialisation n'est pas terminée.
J'ai pensé à implémenter l'interface IDeserializationCallback, mais c'est exactement la même exception qui est levée.
Est-il incorrect de ma part de procéder comme je le fais ?
Existe-t-il un moyen plus approprié pour réaliser cela ?
Merci d'avance
Pierre
Code utilisé pour la sérialisation et la désérialisation
Classe utilisée pour les tests
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 MaClasse m1 = new MaClasse(); // Instance originale MemoryStream stream = new MemoryStream(); // Flux utilisé pour la sérialisation/désérialisation BinaryFormatter formatter = new BinaryFormatter(); // Formatteur binaire formatter.Serialize(stream, m1); // Sérialisation de l'objet stream.Seek(0, SeekOrigin.Begin); // Repositionnement au début du flux MaClasse mc2 = (MaClasse) formatter.Deserialize(stream); // Désérialisation dans un nouvel objet
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 [Serializable] public class MaClasse : ISerializable, IDeserializationCallback { // Constructeur par défaut public MaClasse() { // Ajout d'éléments initiaux m_MonDico.Add(0, "0"); m_MonDico.Add(1, "1"); m_MonDico.Add(2, "2"); } // Dictionnaire private Dictionary<int, string> m_MonDico = new Dictionary<int, string>(); /// <summary> /// Implémentation de l'interface ISerializable /// </summary> #region ISerializable Members // Constructeur pour la désérialisation private MaClasse(SerializationInfo info, StreamingContext context) { // Désérialisation du dictionnaire m_MonDico = (Dictionary<int, string>)info.GetValue("MonDico", typeof(Dictionary<int, string>)); // Ajout d'un élément m_MonDico.Add(8, "8"); } // Méthode appelée lors de la sérialisation public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("MonDico", m_MonDico); } #endregion /// <summary> /// Implémentation de l'interface IDeserializationCallback /// </summary> #region IDeserializationCallback Members // Evènement appelé après la désérialisation public void OnDeserialization(object sender) { // Ajout d'un élément m_MonDico.Add(9, "9"); } #endregion }
Partager