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
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
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
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
	}