Сериализуемый словарь в .NET в Framework 2.0 - PullRequest
1 голос
/ 08 декабря 2011

Я ищу сериализуемый словарь в C # (Framework 2.0), и я нашел это:

http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

, что довольно мило, но я бы хотел, чтобы он сериализовал мой словарь так:

<item>
    <key>my_first_key</key>
    <value>my_first_value</value>
</item>
<item>
    <key>my_second_key</key>
    <value>my_second_value</value>
</item>

Я пытался изменить метод writeXml следующим образом:

writer.WriteStartElement("item")
writer.WriteElementString("key", key.ToString)   
writer.WriteElementString("value", value.ToString)  

И это прекрасно работает, но чтобы десериализовать ввод XML как словарь, мне не удается заставить его работать. Я попробовал это:

reader.ReadStartElement("item")

reader.ReadStartElement("key")
Dim key As String = reader.ReadString()

И я правильно понял ключ, но в объект String. И когда я пытаюсь добавить свою пару ключ / значение следующим образом:

Me.Add(key, value)

Это не работает, так как ключ - это строка, а не тип TKey. Вы знаете, как "привести" или преобразовать строку в TKey? Или инкапсулировать ключ / значение в виде строки в тип TKey / Tvalue?

Заранее большое спасибо!

1 Ответ

1 голос
/ 08 декабря 2011

Кажется, ваше требование сосредоточено на строке, в то время как предлагаемый код является общим.Тем не менее, вы можете, вероятно, это особый случай, то есть

reader.ReadStartElement("key");
if(typeof(TKey) == typeof(string)) {
    TKey key = (TKey)(object)reader.ReadString();
} else {           
    TKey key = (TKey)keySerializer.Deserialize(reader);
}
reader.ReadEndElement();

(и аналогично для значения)

и:

writer.WriteStartElement("item")
if(typeof(TKey) == typeof(string)) {
    writer.WriteElementString("key", (string)(object)key);
} else {
    writer.WriteStartElement("key");
    keySerializer.Serialize(writer, key);
    writer.WriteEndElement();
}

(и аналогично для значения)

Непроверенный - но должен делать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...