Сериализация родового словаря «полу». (С #) - PullRequest
1 голос
/ 14 марта 2010

Используя ссылку из ... http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx У меня есть сериализуемый универсальный словарь.

Одна вещь, которую я хотел сделать, это добавить Ключ в узлы Атрибутов Значений (только потому, что я так хотел отформатировать) Часто Ключ - это просто строка. Есть ли способ заставить класс придерживаться этого? Это говорит мне, что TKey не может быть приведен к строке из read.GetAttribute ("Key"); на узле Значение.

    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 Ответ

1 голос
/ 14 марта 2010

Часто это может быть строка. А как насчет того времени, когда это не так?

Как бы вы справились с этим и сериализовали произвольный контент в атрибут?

Оригинальный код, использованный keySerializer.Serialize(writer, key); для причины.

Если вы точно знаете, что ключ является строкой, вы можете изменить код на что-то вроде public class StringKeyDictionary<TValue> : Dictionary<string, TValue>, IXmlSerializable и использовать свой код.

...