我有一个班级,希望将其序列化为xml。 该类包含一个字典..将其切换为可序列化的版本(使用writexml / readxml)。
问题是当字典参数被序列化时...它用字母元素包装字典元素"属性"我不想要那个。
示例:
public class Product
{
public String Identifier{ get; set; }
[XmlElement]
public SerializableDictionary<string,string> Attributes { get; set; } //custom serializer
}
将此Product类放入List结构中,然后将整个事物序列化,从而产生:
<Products>
<Product>
<Identifier>12345</Identifier>
<Attributes>
<key1> value 1</key1>
<key2> value 2</key2>
</Attributes>
</Product>
</Products>
我想没有节点包装器。
我使用的是序列化字典类,但是通过它的WriteXml我只能影响键值对..而不是父元素。
任何自足的例子,我可以说插入linqpad将是伟大的.. 这是序列化字典的简短版本..
[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)
{
//not including for the sake of brevity
}
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(key.ToString());
TValue value = this[key];
if (value == null)
writer.WriteValue(String.Empty); //render empty ones.
else
writer.WriteValue(value.ToString());
writer.WriteEndElement();
}
}
#endregion
}
答案 0 :(得分:0)
Attributes是字典键值对的名称。如果不存在,您将无法将其反序列化回字典。
答案 1 :(得分:0)
如果您不想使用<Attributes>
元素,则需要将WriteXml
方法移至Product
- 类。
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("Identifier", Identifier.ToString("d"));
XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
foreach (TKey key in Attributes.Keys)
{
writer.WriteStartElement(key.ToString());
TValue value = Attributes[key];
if (value == null)
writer.WriteValue(String.Empty); //render empty ones.
else
writer.WriteValue(value.ToString());
writer.WriteEndElement();
}
}