En développant mon problème précédent , j'ai décidé de (dé) sérialiser ma classe de fichier de configuration qui fonctionnait très bien.
Je veux maintenant stocker un tableau associatif de lettres de lecteur à carte (clé est la lettre du lecteur, la valeur est le chemin réseau) et ont essayé d' utiliser Dictionary
, HybridDictionary
et Hashtable
pour cela , mais je reçois toujours l'erreur suivante lors de l' appel ConfigFile.Load()
ou ConfigFile.Save()
:
Une erreur s'est produite dans le type "App.ConfigFile". [snip] System.NotSupportedException: impossible de sérialiser le membre App.Configfile.mappedDrives [snip]
D'après ce que j'ai lu, les dictionnaires et les HashTables peuvent être sérialisés, alors qu'est-ce que je fais de mal?
[XmlRoot(ElementName="Config")]
public class ConfigFile
{
public String guiPath { get; set; }
public string configPath { get; set; }
public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();
public Boolean Save(String filename)
{
using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
serializer.Serialize(filestream, this);
return true;
} catch(Exception e) {
MessageBox.Show(e.Message);
return false;
}
}
}
public void addDrive(string drvLetter, string path)
{
this.mappedDrives.Add(drvLetter, path);
}
public static ConfigFile Load(string filename)
{
using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
return (ConfigFile)serializer.Deserialize(filestream);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.ToString());
return new ConfigFile();
}
}
}
}
la source
DataContractSerializer
classe puisse le faire. Juste la sortie est un peu moche.Il existe une solution sur le Weblog de Paul Welter - Dictionnaire générique XML sérialisable
la source
string
valeurs, mais lancera uneInvalidOperationException
désérialisation en mentionnant un élément wrapper inattendu si vous essayez d'y stocker des objets personnalisés ou des tableaux de chaînes. (Voir ma question pour un exemple des problèmes auxquels j'ai été confronté.)Au lieu d'utiliser,
XmlSerializer
vous pouvez utiliser un fichierSystem.Runtime.Serialization.DataContractSerializer
. Cela peut sérialiser des dictionnaires et des interfaces sans effort.Voici un lien vers un exemple complet, http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
la source
Créez un substitut de sérialisation.
Exemple, vous avez une classe avec une propriété publique de type Dictionary.
Pour prendre en charge la sérialisation Xml de ce type, créez une classe clé-valeur générique:
Ajoutez un attribut XmlIgnore à votre propriété d'origine:
Exposez une propriété publique de type tableau, qui contient un tableau d'instances SerializableKeyValue, qui sont utilisées pour sérialiser et désérialiser dans la propriété SearchCategories:
la source
Vous devriez explorer Json.Net, assez facile à utiliser et qui permet aux objets Json d'être désérialisés directement dans Dictionary.
james_newtonking
exemple:
la source
Les dictionnaires et les tables de hachage ne sont pas sérialisables avec
XmlSerializer
. Par conséquent, vous ne pouvez pas les utiliser directement. Une solution de contournement serait d'utiliser leXmlIgnore
attribut pour masquer ces propriétés du sérialiseur et les exposer via une liste de paires clé-valeur sérialisables.PS: construire un
XmlSerializer
est très coûteux, donc mettez-le toujours en cache s'il y a une chance de pouvoir le réutiliser.la source
Je voulais une classe SerializableDictionary qui utilisait des attributs xml pour la clé / valeur, j'ai donc adapté la classe de Paul Welter.
Cela produit du XML comme:
Code:
Tests unitaires:
la source
la classe Dictionary implémente ISerializable. La définition du dictionnaire de classe donnée ci-dessous.
Je ne pense pas que ce soit le problème. reportez-vous au lien ci-dessous, qui indique que si vous avez un autre type de données qui n'est pas sérialisable, le dictionnaire ne sera pas sérialisé. http://forums.asp.net/t/1734187.aspx?Is+Dictionary+serializable+
la source
Vous pouvez utiliser ExtendedXmlSerializer . Si vous avez un cours:
et créez une instance de cette classe:
Vous pouvez sérialiser cet objet à l'aide d'ExtendedXmlSerializer:
Le XML de sortie ressemblera à:
Vous pouvez installer ExtendedXmlSerializer à partir de nuget ou exécuter la commande suivante:
Voici un exemple en ligne
la source
Cet article explique exactement comment gérer cela: Comment puis-je ... Sérialiser une table de hachage en C # lorsque l'application le requiert?
J'espère que ceci est utile
la source