【问题标题】:XML Serializing a class with a Dictionary<string, List<string>> objectXML 用 Dictionary<string, List<string>> 对象序列化一个类
【发布时间】:2010-06-11 23:39:55
【问题描述】:

是否可以实现 IXmlSerializable 并在我的 XML 文件中捕获 Dictionary> 类型的对象?

我有以下

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 文件中)

【问题讨论】:

    标签: c# generics xml-serialization


    【解决方案1】:
    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>
    

    另一方面,只需迭代它并重建它。我希望代码是正确的,我只是按照你的例子做的。您可能需要调整方法调用,但在伪中它应该是正确的。

    【讨论】:

    • 啊,我很害怕——不得不迭代,我想一定有更好的方法,我猜不是——谢谢!
    • np,只是练习即时写作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多