J'essaie de sérialiser un dictionnaire en C#. Tous theexamples que je suis en mesure de trouver créer XML comme suit:IXmlSerializable dictionary in C# sans nœuds 'Key'/'Value'
<Dictionary>
<ArrayOfEntries>
<Entry>
<Key>myFirstKey</Key>
<Value>myFirstValue</Value>
</Entry>
<Entry>
<Key>mySecondKey</Key>
<Value>mySecondValue</Value>
</Entry>
</ArrayOfEntries>
</Dictionary>
Il varie, parfois le nœud ArrayOfEntries
est pas nécessaire, mais je vois toujours le modèle régulier des paires clé-valeur du dictionnaire étant stockés dans leurs propres nœuds. Ce que je voudrais quelque chose comme ce qui suit:
<Dictionary>
<myFirstKey>myFirstValue</myFirstKey>
<mySecondKey>mySecondValue</mySecondKey>
</Dictionary>
J'ai écrit ReadXml
et WriteXml
de le faire avant et il fonctionne pour un seul dictionnaire, mais si je tente de sérialiser et désérialiser un List<T>
de mes instances sérialisables dictionnaire , la liste deserialized se termine avec seulement le dernier dictionnaire sérialisable en elle. Je pense que quelque chose doit être gourmand à propos de ma méthode de lecture ou d'écriture de sorte qu'elle ne sache pas quand s'arrêter. Voici mes sérialisables méthodes de dictionnaire qui actuellement ne fonctionnent pas pour la sérialisation des List
« s de dictionnaires sérialisables:
public void WriteXml(XmlWriter writer)
{
foreach (string key in getKeysToSerialize())
{
string cleanKey = key.SanitizeForXml();
string value = getValueForKey(key).Trim();
if (isCdata(key, value))
{
string cdataFriendlyValue = cleanStringForUseInCdata(value);
if (string.IsNullOrEmpty(cdataFriendlyValue))
{
continue;
}
writer.WriteStartElement(cleanKey);
writer.WriteCData(cdataFriendlyValue);
writer.WriteEndElement();
}
else
{
writer.WriteElementString(cleanKey, value);
}
}
}
Et ReadXml
:
public void ReadXml(XmlReader reader)
{
string key = null, value = null;
bool wasEmpty = reader.IsEmptyElement;
while (reader.Read())
{
if (wasEmpty)
{
return;
}
switch (reader.NodeType)
{
case XmlNodeType.Element:
key = reader.Name;
if (keyIsSubTree(key))
{
using (XmlReader subReader = reader.ReadSubtree())
{
storeSubtree(key, subReader);
}
// Reset key to null so we don't try to parse it as
// a regular key-value pair later
key = null;
}
break;
case XmlNodeType.Text:
value = reader.Value;
break;
case XmlNodeType.CDATA:
value = cleanCdataForStoring(reader.Value);
break;
case XmlNodeType.EndElement:
if (!string.IsNullOrEmpty(key))
{
string valueToStore =
string.IsNullOrEmpty(value) ? string.Empty : value
Add(key, valueToStore);
}
key = null;
value = null;
break;
}
}
}
Une différence que j'ai remarqué entre autres tutoriels et ce Je fais est que beaucoup utilisent XmlSerializer
pour sérialiser et désérialiser les objets dans leurs ReadXml
et WriteXml
, alors que j'utilise WriteElementString
et similaires. Ma question est, comment est-ce que je peux sérialiser un dictionnaire tel que son XML est comme mon deuxième exemple XML ci-dessus, mais de sorte que la sérialisation et la désérialisation d'un List<MySerializableDictionary>
fonctionne également? Même juste des allusions de "pourquoi faites-vous blah, qui pourrait le faire agir drôle" aiderait.
Supposons-nous que votre dictionnaire est un Dictionary ici? –
insipid
@insipid, whoops, oui c'est 'Dictionary'. –