I';我不知道如何最好地组织数据,以便XML序列化程序对其进行序列化

本文关键字:序列化 XML 以便 程序 数据 我不知道 何最好 | 更新日期: 2023-09-27 17:59:51

我有一个Setting结构,它包含一个namedescriptiontype作为strings,以及一个value作为Object。现在有一个类,它包含一组设置。这个类基本上充当了一个工厂,它创建的对象应该包含这些settings的列表/数组,这些列表/数组属于键。我最好的想法是创建这样一个Dictionary:Dictionary<KeyCode, Setting[]>,甚至更好的Dictionary<KeyCode, Dictionary<string, Settings>>(通过设置名称组织),但不幸的是Dictionary不能通过XML序列化。现在我有两个问题:

XML是否可以序列化和反序列化Object类型的对象(它们只包含float和bool等值类型)?

如何将设置列表分配给键,同时保持xml的可序列化性?

I';我不知道如何最好地组织数据,以便XML序列化程序对其进行序列化

有一个IXmlSerializable字典。这摘自Paul Welter的Weblog-XML可序列化通用词典

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
[XmlRoot("dictionary")]
public class SerializableDictionary<TKey, TValue>
    : Dictionary<TKey, TValue>, IXmlSerializable
{
    #region IXmlSerializable Members
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();
        if (wasEmpty)
            return;
        while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");
            reader.ReadStartElement("key");
            TKey key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();
            reader.ReadStartElement("value");
            TValue value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();
            this.Add(key, value);
            reader.ReadEndElement();
            reader.MoveToContent();
        }
        reader.ReadEndElement();
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        foreach (TKey key in this.Keys)
        {
            writer.WriteStartElement("item");
            writer.WriteStartElement("key");
            keySerializer.Serialize(writer, key);
            writer.WriteEndElement();
            writer.WriteStartElement("value");
            TValue value = this[key];
            valueSerializer.Serialize(writer, value);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
    #endregion
}

对于第二个问题,您可以使用XmlElement标记告诉Object类型属性它可以接受的可能值:

public class MyClass
{
   [XmlElement("a", Type = typeof(int))]
   [XmlElement("b", Type = typeof(string))]
   [XmlElement("c", Type = typeof(float))]
    public object Value { get; set; }
}

xml将根据类型生成每个值:

<MyClass>
  <b>abc</b>
</MyClass>
<MyClass>
  <a>123</a>
</MyClass>
<MyClass>
  <c>45.7</c>
</MyClass>
相关文章: