1

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

2 に答える 2

0

Attributes は、ディクショナリ キーと値のペアの名前です。それが存在しない場合、辞書に逆シリアル化することはできません。

于 2012-10-12T10:54:39.380 に答える
0

要素が必要ない場合は、メソッドを-class<Attributes>に移動する必要があります。WriteXmlProduct

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();
    }
}
于 2012-10-12T12:39:56.377 に答える