'半'通用字典序列化。 (C#)

时间:2010-03-13 23:05:45

标签: c# generics xml-serialization

使用来自... http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx的引用我有一个可序列化的通用字典。

我想做的一件事是将Key添加到Values的Attribute节点中(仅仅因为它是我希望它格式化的方式)。通常,Key只是一个字符串。有没有办法强迫班级坚持这个?它告诉我TKey不能从read.GetAttribute(“Key”)转换成字符串;在Value节点上。

    while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
    {
        reader.ReadStartElement("Entry");

        reader.ReadStartElement("Key");

        //TKey key = (TKey)keySerializaer.Deserialize(reader);

        reader.ReadEndElement();

        reader.ReadStartElement("Value");
            TKey key = reader.GetAttribute("Name");

        TValue value = (TValue)valueSerializer.Deserialize(reader);

        reader.ReadEndElement();

        this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent();
    }

同样,相反的'WriteXml'......

        writer.WriteStartElement("Entry");

        writer.WriteStartElement("Key");
        keySerializaer.Serialize(writer, key);
        writer.WriteEndElement();

        writer.WriteStartElement("Value");
            writer.WriteAttributeString("Name", key.ToString());
        TValue value = this[key]; 
        valueSerializer.Serialize(writer, value);
        writer.WriteEndElement();

        writer.WriteEndElement();

1 个答案:

答案 0 :(得分:1)

它通常可能是一个字符串。什么时候不是呢?

您将如何处理并将任意内容序列化为属性?

原始代码使用keySerializer.Serialize(writer, key);是有原因的。

如果您明确知道密钥是字符串,则可以将代码更改为public class StringKeyDictionary<TValue> : Dictionary<string, TValue>, IXmlSerializable并使用您的代码。