Als Erweiterung meines früheren Problems habe ich beschlossen, meine Konfigurationsdateiklasse (de) zu serialisieren, was hervorragend funktioniert hat.
Ich möchte jetzt ein assoziatives Array von Laufwerksbuchstaben speichern , zu kartieren (Schlüssel ist der Laufwerksbuchstabe, den Wert der Netzwerkpfad) und haben versucht , mit Dictionary
, HybridDictionary
und Hashtable
dafür , aber ich immer folgende Fehlermeldung erhalten , wenn Sie anrufen ConfigFile.Load()
oder ConfigFile.Save()
:
Es ist ein Fehler aufgetreten, der den Typ 'App.ConfigFile' widerspiegelt. [snip] System.NotSupportedException: Mitglied App.Configfile.mappedDrives kann nicht serialisiert werden [snip]
Nach dem, was ich gelesen habe, können Wörterbücher und HashTables serialisiert werden. Was mache ich also falsch?
[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();
}
}
}
}
quelle
DataContractSerializer
nur, ob die Klasse das kann. Nur die Ausgabe ist etwas hässlich.Im Weblog von Paul Welter gibt es eine Lösung - XML Serializable Generic Dictionary
quelle
string
Werte speichert, löst jedoch eineInvalidOperationException
Deserialisierung aus, in der ein unerwartetes Wrapper-Element erwähnt wird, wenn Sie versuchen, benutzerdefinierte Objekte oder String-Arrays darin zu speichern. (Siehe meine Frage für ein Beispiel der Probleme, mit denen ich konfrontiert war.)Anstelle von können
XmlSerializer
Sie auch a verwendenSystem.Runtime.Serialization.DataContractSerializer
. Dies kann Wörterbücher serialisieren und Schnittstellen ohne Schweiß.Hier ist ein Link zu einem vollständigen Beispiel: http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
quelle
Erstellen Sie einen Serialisierungsersatz.
Beispiel: Sie haben eine Klasse mit einer öffentlichen Eigenschaft vom Typ Dictionary.
Erstellen Sie eine generische Schlüsselwertklasse, um die XML-Serialisierung dieses Typs zu unterstützen:
Fügen Sie Ihrer ursprünglichen Eigenschaft ein XmlIgnore-Attribut hinzu:
Stellen Sie eine öffentliche Eigenschaft vom Array-Typ bereit, die ein Array von SerializableKeyValue-Instanzen enthält, die zum Serialisieren und Deserialisieren in die SearchCategories-Eigenschaft verwendet werden:
quelle
Sie sollten Json.Net erkunden, das recht einfach zu verwenden ist und die direkte Deserialisierung von Json-Objekten im Wörterbuch ermöglicht.
james_newtonking
Beispiel:
quelle
Wörterbücher und Hashtabellen können nicht mit serialisiert werden
XmlSerializer
. Daher können Sie sie nicht direkt verwenden. Eine Problemumgehung wäre die Verwendung vonXmlIgnore
Attribut zu verwenden, um diese Eigenschaften vor dem Serializer auszublenden und über eine Liste serialisierbarer Schlüssel-Wert-Paare verfügbar zu machen.PS: Das Erstellen eines
XmlSerializer
ist sehr teuer, also zwischenspeichern Sie es immer, wenn die Möglichkeit besteht, es wiederzuverwenden.quelle
Ich wollte eine SerializableDictionary-Klasse, die XML-Attribute für Schlüssel / Wert verwendet, also habe ich die Klasse von Paul Welter angepasst.
Dies erzeugt XML wie:
Code:
Unit Tests:
quelle
Die Dictionary-Klasse implementiert ISerializable. Die unten angegebene Definition des Klassenwörterbuchs.
Ich denke nicht, dass das das Problem ist. Verweisen Sie auf den folgenden Link, der besagt, dass das Wörterbuch nicht serialisiert wird, wenn Sie einen anderen Datentyp haben, der nicht serialisierbar ist. http://forums.asp.net/t/1734187.aspx?Is+Dictionary+serializable+
quelle
Sie können ExtendedXmlSerializer verwenden . Wenn Sie eine Klasse haben:
und erstellen Sie eine Instanz dieser Klasse:
Sie können dieses Objekt mit ExtendedXmlSerializer serialisieren:
Die Ausgabe-XML sieht folgendermaßen aus:
Sie können ExtendedXmlSerializer von Nuget aus installieren oder den folgenden Befehl ausführen:
Hier ist ein Online-Beispiel
quelle
Dieser Artikel erklärt genau, wie man damit umgeht: Wie kann ich ... eine Hash-Tabelle in C # serialisieren, wenn die Anwendung dies erfordert?
Ich hoffe das ist hilfreich
quelle