2010-03-04 4 views
3

lorsque j'essaie de sérialiser un dictionnaire, tout a bien fonctionné. mais quand je désérialise c'est montrer le compte comme 0. Mais, cela fonctionne bien avec une liste. Qu'est-ce qui se passe exactement quand nous désérialisons une liste et un dictionnaire?Problème de désérialisation avec le dictionnaire

+1

Montrez-nous du code puis! – spender

+0

Quel sérialiseur? Cela compte un ** lot **? Est-ce 'XmlSerializer'? 'BinaryFormatter'? 'DataContractSerializer'? 'NetDataContractSerializer'? JSON? proto bufs? SAVON? J'ai peur que chacun ait un comportement subtilement différent. Beaucoup (pas tous) * ne * prennent en charge la sérialisation du dictionnaire. Vous pouvez également avoir besoin d'étapes supplémentaires si vous avez effectué une sérialisation personnalisée ('ISerializable' etc.). –

+0

J'essaie de sérialiser en utilisant BinaryFormatter .. – sandhya

Répondre

3

Les dictionnaires ne prennent pas réellement en charge la sérialisation. C'est un problème connu qui dérange beaucoup de programmeurs, donc si vous "Google Serialization" .NET vous obtiendrez de nombreux résultats avec "how-to" et solutions de contournement. Par exemple, blog post suggère d'utiliser la classe KeyedCollection à la place.

+0

Vous avez raison à propos des dictionnaires, mais les exceptions peuvent être sérialisées. – Timores

+0

@Timores, j'ai effacé la partie sur les exceptions. J'ai rencontré des problèmes lors de la sérialisation des exceptions dues à un membre du dictionnaire contenu, mais cela peut être lié à un type spécifique d'exception que je numérotais ou au fait que j'utilisais XmlSerializer ou même au fait que j'utilisais VB. De toute façon, je ne pense pas que vous puissiez généralement dire que toutes les exceptions sont sérialisables, je suppose que la vérité est quelque part entre les deux. S'il vous plaît élaborer si vous avez des informations supplémentaires sur ce sujet. –

+0

En général, toutes les classes ne sont pas sérialisables, je suis d'accord. Et nous devons définir si nous parlons de sérialisation binaire ou de sérialisation XML. Je pensais à la première, où vous pouvez implémenter ISerializable pour prendre en charge le processus de sérialisation et sérialiser une classe avec un dictionnaire incorporé. Vous pouvez utiliser n'importe quel langage .NET, d'ailleurs, ils sont tous sémantiquement équivalents. – Timores

1

Si vous utilisez .Net 3.5, vous pouvez utiliser DataContractSerializer pour sérialiser un dictionnaire. C'est aussi plus rapide qu'un BinaryFormatter ou un XmlSerializer.

using System.Runtime.Serialization; 

var dict = new Dictionary<string, string>(); 
dict.Add("a","a"); 

DataContractSerializer dcs = new DataContractSerializer(dict.GetType()); 
MemoryStream byteStream = new MemoryStream(); 
dcs.WriteObject(byteStream, dict); 
byteStream.Position = 0; 

var dict2 = dcs.ReadObject(byteStream); 
Questions connexes