我正在尝试在 C# 中序列化字典。我能够找到的 所有示例都创建如下 XML:
<Dictionary>
<ArrayOfEntries>
<Entry>
<Key>myFirstKey</Key>
<Value>myFirstValue</Value>
</Entry>
<Entry>
<Key>mySecondKey</Key>
<Value>mySecondValue</Value>
</Entry>
</ArrayOfEntries>
</Dictionary>
它会有所不同,有时ArrayOfEntries
节点不是必需的,但我仍然看到字典键值对的常规模式存储在它们自己的节点中。我想要的是如下内容:
<Dictionary>
<myFirstKey>myFirstValue</myFirstKey>
<mySecondKey>mySecondValue</mySecondKey>
</Dictionary>
我以前写过ReadXml
并WriteXml
这样做过,它适用于单个字典,但是如果我尝试序列化和反序列化List<T>
我的可序列化字典实例,反序列化列表最终只包含最后一个可序列化字典。我认为我的读取或写入方法一定是贪婪的,以至于它不知道何时停止。这是我的可序列化字典方法,目前不适用于可序列List
化字典的序列化:
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);
}
}
}
并且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;
}
}
}
我注意到其他教程和我正在做的事情之间的一个区别是,许多人使用XmlSerializer
and 中的对象进行序列化和反序列化ReadXml
,WriteXml
而我使用WriteElementString
and 之类的。
我的问题是,我怎样才能序列化一个字典,使它的 XML 就像我上面的第二个 XML 示例一样,但是序列化和反序列化 aList<MySerializableDictionary>
也可以工作?即使只是暗示“你为什么要这样做,这可能会让它变得有趣”也会有所帮助。