XML Сериализация класса с помощью объекта Dictionary <string, List <string>> - PullRequest
1 голос
/ 12 июня 2010

Можно ли реализовать IXmlSerializable и в моем файле XML захватить объект типа Словарь>?

У меня есть следующее

public class coolio : IXmlSerializable
{
private int a;
private bool b;
private string c;
private Dictionary<string, List<string>> coco;

public coolio(int _a, bool _b, string _c, Dictionary<string, List<string>> _coco)
    {
    a=_a;
    b=_b;
    c=_c;
    coco=_coco;
    }

public System.Xml.Schema.XmlSchema GetSchema()
    {
    return null;
    }

public void WriteXml(XmlWriter writer)
    {
    const string myType = "coolio";
    writer.WriteStartElement(myType);
    writer.WriteAttributeString("a", a.ToString());
    writer.WriteAttributeString("b", b.ToString());
    writer.WriteAttributeString("c", c);

    // How do I add a subelement for Dictionary<string, List<string>> coco?

    writer.WriteEndElement();
    }

public void ReadXml(XmlReader reader)
    {
    if (reader.MoveToContent() != XmlNodeType.Element || reader.LocalName != "coolio") 
                return;
    a= int.Parse(reader["a"]);
    b = bool.Parse(reader["b"]);
    c= reader["c"];

    // How do I read subelement into Dictionary<string, List<string>> coco?
    }
}

Но я озадачен тем, как я могдобавить словарь> (XML-сериализация в мой XML-файл)

1 Ответ

1 голос
/ 12 июня 2010
writer.WriteStartElement("CocoKeys");
foreach (var kvp in coco)
{
  writer.WriteStartElement("CocoKey");
  writer.WriteAttributeString("key", kvp.Key);
  writer.WriteStartElement("CoCoValues");
  foreach(string s in kvp.Value)
  {
    writer.WriteStartElement("CoCoValue");
    writer.WriteString(s);
    writer.WriteEndElement();
  }
  writer.WriteEndElement();
  writer.WriteEndElement();
  writer.WriteEndElement();
}

Это должно вывести что-то вроде этого:

<CocoKeys>
  <CocoKey key="sample">
  <CocoValues>
    <CocoValue>Sample1</CocoValue>
    <CocoValue>Sample2</CocoValue>
    <CocoValue>Sample3</CocoValue>
  </CocoKey>
</CocoKeys>

С другой стороны, просто переберите его и реконструируйте.Надеюсь, код верен, я сделал это только на вашем примере.Возможно, вам придется настроить вызовы методов, но в псевдо-коде это должно быть правильно.

...