Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 39
1
.NET 4.x

Dictionary: как сохранить значении коллекции после завершения программы

24.12.2012, 20:04. Показов 3620. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пишу словарь с помощь коллекции Dictionary, столкнуля с проблемой как сохранить значении коллекции после завершения программы. Пробовал с помощью сериализации, но не выходит, выдает ошибку «Тип System.Collections.Generic.Dictionary`2…. не поддерживается, т.к. он реализует IDictionary.» Кто-нибудь может посоветовать как надо сохранять эти коллекции? В заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2012, 20:04
Ответы с готовыми решениями:

Как сохранить данные после завершения работы программы?
Как сохранить данные после завершения работы программы ? С базами данных, вроде, мысль ясна. Но...

Как сохранить динамические объекты после завершения программы
Всем доброго времени суток. У меня программе пользователь, например, может добавить Label и задать...

Как настроить автоматический переход в Windows XP из MS DOS после завершения работы некой программы?
Добрый день! Подскажите, как решить такой вопрос. Есть некая прога, которая работает в dos. После...

Как получить строковое представление ключей и значений из коллекции Dictionary
Как получить строковое представление значений ключе я значений из коллекции Dictionary

4
55 / 55 / 14
Регистрация: 26.04.2010
Сообщений: 177
24.12.2012, 21:54 2
Я делал как-то так (словарь в строку, строку - в поле БД или в файл, потом обратно из хранилища в строку и в словарь):


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        public class DataItem
        {
            public int Key;
            public string Value;
            public DataItem()
            {
                Key = 0;
                Value = "";
            }
            public DataItem(int key, string value)
            {
                Key = key;
                Value = value;
            }
        }
 
        public static string SerializeDictionary(Dictionary<int, string> dictionary)
        {
            List<DataItem> items = new List<DataItem>(dictionary.Count);
            foreach (int key in dictionary.Keys)
            {
                items.Add(new DataItem(key, dictionary[key].ToString()));
            }
            XmlSerializer serializer = new XmlSerializer(typeof(List<DataItem>));
            StringWriter sw = new StringWriter();
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            serializer.Serialize(sw, items, ns);
            return sw.ToString();
        }
 
        public static void DeserializeDictionary(Dictionary<int, string> dictionary, string RawData)
        {
            if (dictionary == null) return;
            if ((RawData == null) || (RawData.Length == 0)) return;
            dictionary.Clear();
            XmlSerializer xs = new XmlSerializer(typeof(List<DataItem>));
            StringReader sr = new StringReader(RawData);
            try
            {
                List<DataItem> templist = (List<DataItem>)xs.Deserialize(sr);
                foreach (DataItem di in templist)
                {
                    dictionary.Add(di.Key, di.Value);
                }
            }
            catch (InvalidOperationException exc)
            {
                // exception handling
            }
        }
1
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
24.12.2012, 23:44 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    [XmlRoot("Dictionary")]
    public class SerializableDictionary<TKey, TValue> : SortedList<TKey, TValue>, IXmlSerializable
    {
        #region IXmlSerializable Members
 
        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }
 
        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            bool wasEmpty = reader.IsEmptyElement;
 
            reader.Read();
 
            if (wasEmpty)
                return;
 
            var keySerializer = new XmlSerializer(typeof (TKey));
            var valueSerializer = new XmlSerializer(typeof (TValue));
 
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("item");
                reader.ReadStartElement("key");
                var key = (TKey) keySerializer.Deserialize(reader);
                reader.ReadEndElement();
                reader.ReadStartElement("value");
                var value = (TValue) valueSerializer.Deserialize(reader);
                reader.ReadEndElement();
                Add(key, value);
                reader.ReadEndElement();
                reader.MoveToContent();
            }
            reader.ReadEndElement();
        }
 
        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            if (Count > 0)
            {
                var keySerializer = new XmlSerializer(typeof (TKey));
                var valueSerializer = new XmlSerializer(typeof (TValue));
 
                foreach (TKey key in Keys)
                {
                    writer.WriteStartElement("item");
                    writer.WriteStartElement("key");
                    keySerializer.Serialize(writer, key);
                    writer.WriteEndElement();
                    writer.WriteStartElement("value");
                    TValue value = this[key];
                    valueSerializer.Serialize(writer, value);
                    writer.WriteEndElement();
                    writer.WriteEndElement();
                }
            }
        }
 
        #endregion
    }
2
0 / 0 / 0
Регистрация: 31.07.2009
Сообщений: 39
26.12.2012, 14:48  [ТС] 4
Спасибо, сделал на основе вашего кода сер/десереализацию:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void SerializeDictionary(Dictionary<int, string> dictionary)
        {
            List<DataItem> items = new List<DataItem>(dictionary.Count);
            foreach (int key in dictionary.Keys)
            {
                items.Add(new DataItem(key, dictionary[key].ToString()));
            }
            XmlSerializer serializer = new XmlSerializer(typeof(List<DataItem>));
            StringWriter sw = new StringWriter();
            FileStream fs = new FileStream("fileXML.xml", FileMode.Append, FileAccess.Write);
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");
            // serializer.Serialize(sw, items, ns);
            serializer.Serialize(fs, items, ns);
            fs.Close();
            }
 
        public static void DeserializeDictionary(Dictionary<int, string> dictionary, string RawData)
        {
                  
            FileStream fs = new FileStream("fileXML.xml", FileMode.Open, FileAccess.Read);
            XmlSerializer serial = new XmlSerializer(typeof(List<DataItem>), new Type[] { typeof(List<DataItem>) });
            List<DataItem> templist = (List<DataItem>)serial.Deserialize(fs);
            fs.Close();
   
 
            foreach (DataItem di in templist)
            {
             //вывод рез
              Console.WriteLine(di.Key.ToString() + " " + di.Value.ToString());
            }
        }
Результат сереализации сохраняется в файл fileXML.xml. Но теперь новая проблема: допустим я добавил данные, завершил прогу, а потом снова запустил и добавляю - файл fileXML.xml переписывается в нём не сохраняютя ранее введеные данные. Пробывал сделать дозапись в файл FileStream fs = new FileStream("fileXML.xml", FileMode.Append, FileAccess.Write); но на десериализации выдает ошибку "В документе XML (7, 21) присутствует ошибка.". Можно как-то "досериализовать" файл, или как-то можно по другому сделать?
0
55 / 55 / 14
Регистрация: 26.04.2010
Сообщений: 177
26.12.2012, 16:57 5
"Досериализовать" - некорректное понятие. Вы сериализовали некоторый объект. Чтобы внести какие-либо изменения, нужно считать сохранённые данные, внести изменения в поля объекта и заново сериализовать. Ведь если просто "дописать" в xml несколько строк, то объект при этом новых полей не обретёт. Это похоже на ситуацию, когда механик запирает машину в бокс, потом через окно кидает в бокс новые покрышки и надеется, что, открыв бокс, он выведет уже переобутую машину
0
26.12.2012, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2012, 16:57
Помогаю со студенческими работами здесь

Как вывести время работы программы ПОСЛЕ завершения работы progressBar?
У меня почему-то сначала выводится время в MessageBox, а затем уже завершает свою работу...

Вылет программы после завершения
Добрый день. Сегодня решил начать изучение языка программирования. Нашел учебник для чайников, там...

Работа программы после завершения
Добрый день! Столкнулся с проблемой: Пользователь вводит два целых числа a,b. Программа выводит...

Ошибка после завершения программы
После завершения появляется ошибка: _BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse) Видимо нужен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru