クラスがあり、それを 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
}