I';我不知道如何最好地组织数据,以便XML序列化程序对其进行序列化
本文关键字:序列化 XML 以便 程序 数据 我不知道 何最好 | 更新日期: 2023-09-27 17:59:51
我有一个Setting结构,它包含一个name
、description
和type
作为strings
,以及一个value
作为Object
。现在有一个类,它包含一组设置。这个类基本上充当了一个工厂,它创建的对象应该包含这些settings
的列表/数组,这些列表/数组属于键。我最好的想法是创建这样一个Dictionary:Dictionary<KeyCode, Setting[]>
,甚至更好的Dictionary<KeyCode, Dictionary<string, Settings>>
(通过设置名称组织),但不幸的是Dictionary不能通过XML序列化。现在我有两个问题:
XML是否可以序列化和反序列化Object
类型的对象(它们只包含float和bool等值类型)?
如何将设置列表分配给键,同时保持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>