2010-03-13 2 views
1

Использование ссылки из ... http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx У меня есть сериализуемый общий словарь.«Семиризация серийного словаря». (C#)

Одна вещь, которую я хотел сделать, это добавить ключ в узлы атрибутов значений (только потому, что я так хотел отформатировать). Зачастую ключ - это просто строка. Есть ли способ заставить класс придерживаться этого? Это говорит мне, что TKey нельзя отличить от строки read.GetAttribute («Ключ»); на узле 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(); 
    } 

Аналогично, corrosponding '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

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

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

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

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

Смежные вопросы