Je sais qu'on a déjà répondu à cette question, mais comme j'ai une méthode très concise (code) pour faire la sérialisation d'IDictionary avec la classe DataContractSerializer (utilisée par WCF, mais qui pourrait et devrait être utilisée n'importe où), je n'ai pas pu résister à l'envie de la contribuer ici :
public static class SerializationExtensions
{
public static string Serialize<T>(this T obj)
{
var serializer = new DataContractSerializer(obj.GetType());
using (var writer = new StringWriter())
using (var stm = new XmlTextWriter(writer))
{
serializer.WriteObject(stm, obj);
return writer.ToString();
}
}
public static T Deserialize<T>(this string serialized)
{
var serializer = new DataContractSerializer(typeof(T));
using (var reader = new StringReader(serialized))
using (var stm = new XmlTextReader(reader))
{
return (T)serializer.ReadObject(stm);
}
}
}
Cela fonctionne parfaitement dans .NET 4 et devrait également fonctionner dans .NET 3.5, bien que je ne l'aie pas encore testé.
UPDATE : Il n'a pas fonctionne dans .NET Compact Framework (même pas NETCF 3.7 pour Windows Phone 7), car les DataContractSerializer
n'est pas pris en charge !
J'ai fait le streaming vers les chaînes de caractères parce que c'était plus pratique pour moi, bien que j'aurais pu introduire une sérialisation de niveau inférieur à Stream et ensuite l'utiliser pour sérialiser vers les chaînes de caractères, mais j'ai tendance à généraliser seulement quand c'est nécessaire (tout comme l'optimisation prématurée est diabolique, il en est de même pour la généralisation prématurée...)
L'utilisation est très simple :
// dictionary to serialize to string
Dictionary<string, object> myDict = new Dictionary<string, object>();
// add items to the dictionary...
myDict.Add(...);
// serialization is straight-forward
string serialized = myDict.Serialize();
...
// deserialization is just as simple
Dictionary<string, object> myDictCopy =
serialized.Deserialize<Dictionary<string,object>>();
myDictCopy sera une copie verbatim de myDict.
Vous remarquerez également que les méthodes génériques fournies pourront sérialiser n'importe quel type (à ma connaissance) puisque ce n'est pas limité aux interfaces IDictionary, ce peut être vraiment n'importe quel type générique T.
J'espère que cela aidera quelqu'un d'autre !
5 votes
La question est incorrecte, car elle ne tient pas compte de la cause et de l'effet. La question devrait être : "pourquoi
XmlSerializer
ne peut pas sérialiser les dictionnaires" ? Parce qu'il y a de nombreuses façons de faire de la sérialisation XML dans .NET, et la plupart d'entre elles sérialisent très bien les dictionnaires (DataContractSerializer
,SoapFormatter
...).0 votes
Je suppose que vous n'avez pas examiné "XmlDictionaryWriter.CreateDictionaryWriter"... ou les 100 autres façons de sérialiser les dictionnaires dans .NET (certaines d'entre elles sont intégrées). ...Par ailleurs, pourquoi avez-vous besoin d'un dictionnaire ? J'ai toujours trouvé que les objets à typage fort fonctionnaient mieux, pourquoi ne pas simplement implémenter une classe avec un [DataContract], et IExtensibleDataObject ?
0 votes
Quelles sont les fonctionnalités modernes de .NET qui, selon vous, dépendent de la sérialisation XML ? Les fichiers de configuration n'utilisent pas la sérialisation, et les services web ASMX ne sont destinés qu'à une utilisation patrimoniale. (déplacé dans le commentaire de la réponse)