So che questo è stato risposto prima, ma dal momento che ho un modo molto conciso (codice) per fare IDictionary serializzazione con la classe DataContractSerializer (usato da WCF, ma potrebbe e dovrebbe essere utilizzato ovunque) non potevo' t resistono contribuendo qui:
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);
}
}
}
Questo funziona perfettamente in .NET 4 e dovrebbe funzionare anche in .NET 3.5, anche se non ho la prova ancora.
UPDATE: E non lavorare in .NET Compact Framework (nemmeno NETCF 3.7 per Windows Phone 7) come il DataContractSerializer
non è supportato!
Ho eseguito lo streaming su string perché era più conveniente per me, anche se avrei potuto introdurre una serializzazione di livello inferiore su Stream e quindi usarlo per serializzare su stringhe, ma tendo a generalizzare solo quando necessario (proprio come ottimizzazione prematura è il male, quindi è prematuro generalizzazione ...)
uso è molto semplice:
// 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 sarà una copia letterale di myDict.
Noterete anche che i metodi generici forniti saranno in grado di serializzare qualsiasi tipo (al meglio delle mie conoscenze), in quanto non si limita alle interfacce IDictionary, può essere davvero qualsiasi tipo T. generico
Spero che aiuti qualcuno là fuori!
La domanda è errata, perché causa causa ed effetto errati. Dovrebbe essere, "perché' XmlSerializer' non può serializzare i dizionari "? Perché ci sono molti modi per fare serializzazione XML in .NET, e molti di loro serializzano i dizionari bene ('DataContractSerializer',' SoapFormatter' ...). –
Suppongo che tu non abbia esaminato "XmlDictionaryWriter.CreateDictionaryWriter" ... o gli altri 100 modi per serializzare i dizionari in .NET (alcuni di essi sono integrati). ... anche perché hai bisogno di un dizionario? Ho sempre trovato che gli oggetti dattiloscritti funzionavano meglio, perché non implementare solo una classe con [DataContract] e IExtensibleDataObject? – BrainSlugs83
Quali funzionalità moderne in .NET pensi dipenda dalla serializzazione XML? I file di configurazione non utilizzano la serializzazione e i servizi Web ASMX sono pensati solo per l'utilizzo legacy. (spostato sul commento dalla risposta) –