Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995

Как сериализовать значение listBox-а

07.01.2012, 12:33. Показов 5709. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот код:

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
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
       
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        private void Form1_Closing(object sender, FormClosingEventArgs e)
        {
           
        }
 
        public class Katalogizator
        {
            public string org {get; set;}
            public string kom {get; set;}
            public int id {get; set;}
 
           
            }
 
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add(textBox1.Text);
        }
        }
 
        public class Serializer
        {
            //Конвертация в массив байтов
            public byte[] ConvertToByteArray<T>(T serializableObject)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream stream = new MemoryStream())
                {
                    formatter.Serialize(stream, serializableObject);
                    return stream.ToArray();
                }
            }
 
            //Деконвертация:
            public T ConvertFromByteArray<T>(byte[] binaryData)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                using (MemoryStream ms = new MemoryStream(binaryData))
                {
                    return (T)formatter.Deserialize(ms);
                }
            }
        }
  
    }
в него куском добавлена часть с сериализхацией и дисериализацией.

Как сериализовать значение listBox-а? Не могу понять логику написания. Покажите пожалуйста примером. Спасибо
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2012, 12:33
Ответы с готовыми решениями:

Как получить значение ListBox?
Как получить значение ListBox? Пробовал, но в selectedBook не помещается ничего.. var selectedBook = (string)...

Как добавить в listbox значение k в строку n?
Заранее спасибо.

Как прочитать значение флажка в ListBox?
Устанавливаю Style=1 ('CheckBox') А как к этим флажкам обращаться-то? Вроде все свойства пересмотрел...

24
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
07.01.2012, 16:11
C#
1
2
3
4
5
var serializer = new Serializer(); //создаем экземпляр твоего сериализатора
var listBoxItemsInArray = new string[listBox1.Items.Count]; //создаем массив размером с количество элементов в твоем листбоксе
listBox1.Items.CopyTo(listBoxItemsInArray, 0); //копируем элементы листбокса в массив (ибо сам ObjectCollection листбокса не сериализуем)
var serializedStream = serializer.ConvertToByteArray(listBoxItemsInArray); //используя твой сериалайзер конвертим элементы из листбокса в массив байт
listBox1.Items.AddRange(serializer.ConvertFromByteArray<string[]>(serializedStream)); //десериализуем массив байт обратно в строкой массив, который добавляем в коллекцию элементов листбокса
мне, если честно, этот сериалайзер не по душе как-то
0
 Аватар для KarmaMaker
91 / 90 / 11
Регистрация: 09.12.2011
Сообщений: 233
07.01.2012, 16:18
А если нужно, чтобы на выходе был читабельный xml файл?
Без использования XmlSerializer ( Он требует нарушения инкапсуляции, что мне не нравится ).
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
07.01.2012, 16:23
Цитата Сообщение от Lovrentiy Посмотреть сообщение
C#
1
2
3
4
5
6
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
   formatter.Serialize(stream, serializableObject);
   return stream.ToArray();
}
читабельный XML файл говоришь? человеку это вообще не уперлось по-моему...

Цитата Сообщение от KarmaMaker Посмотреть сообщение
XmlSerializer ( Он требует нарушения инкапсуляции, что мне не нравится ).
а вот это с чего вдруг?
0
389 / 304 / 67
Регистрация: 10.07.2010
Сообщений: 802
07.01.2012, 16:24
а если надо читабельно, тогда нафиг сериализация не нужна, создать xml файл, циклом добавить нужные строки и так же циклом потом их обратно вогнать.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.01.2012, 16:27
Цитата Сообщение от KarmaMaker Посмотреть сообщение
Он требует нарушения инкапсуляции
Простите, каким образом?
Единственное, что приходит в голову - это требование к наличию дефолтного конструктора в сериализируемом классе.
0
 Аватар для KarmaMaker
91 / 90 / 11
Регистрация: 09.12.2011
Сообщений: 233
07.01.2012, 16:33
XmlSerializer ( Он требует нарушения инкапсуляции, что мне не нравится ).
а вот это с чего вдруг?
XmlSerializer Требует, чтобы поля класса были открытыми для чтения и записи. Хотя возможно я просто не умею его правильно готовить.

человеку это вообще не уперлось по-моему...
Я - эстет.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.01.2012, 16:59
Цитата Сообщение от KarmaMaker Посмотреть сообщение
XmlSerializer Требует, чтобы поля класса были открытыми для чтения и записи. Хотя возможно я просто не умею его правильно готовить.
Немного не так. XmlSerializer требует, чтобы сериализируемые свойства были доступны для чтения и записи. А это не нарушает инкапсуляцию.
0
 Аватар для KarmaMaker
91 / 90 / 11
Регистрация: 09.12.2011
Сообщений: 233
07.01.2012, 19:07
Немного не так. XmlSerializer требует, чтобы сериализируемые свойства были доступны для чтения и записи. А это не нарушает инкапсуляцию.
Не очень понял какая разница: допустим есть класс
C#
1
2
3
4
5
class Pet
{
    public string Name { get; private set; }
    public string Species { get; private set; }
}
Что нужно сделать чтобы сериализовать объекты этого класса не трогая "private set"

Добавлено через 11 минут
Т.е. нет, разница то конечно есть, но только не в том случае когда нужно сереализовать все поля класса.
0
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
07.01.2012, 20:32  [ТС]
Цитата Сообщение от znake Посмотреть сообщение
C#
1
2
3
4
5
var serializer = new Serializer(); //создаем экземпляр твоего сериализатора
var listBoxItemsInArray = new string[listBox1.Items.Count]; //создаем массив размером с количество элементов в твоем листбоксе
listBox1.Items.CopyTo(listBoxItemsInArray, 0); //копируем элементы листбокса в массив (ибо сам ObjectCollection листбокса не сериализуем)
var serializedStream = serializer.ConvertToByteArray(listBoxItemsInArray); //используя твой сериалайзер конвертим элементы из листбокса в массив байт
listBox1.Items.AddRange(serializer.ConvertFromByteArray<string[]>(serializedStream)); //десериализуем массив байт обратно в строкой массив, который добавляем в коллекцию элементов листбокса
мне, если честно, этот сериалайзер не по душе как-то
Сейчас попробую. На самом деле, я наоборот склоняюсь к xml сериализации, просто я не могу понять как воплотить =) А так, в моём случае кол-=во данных не велико и xml предпочтительнее. Если можно пример, был бы премного благодарен.
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
07.01.2012, 20:39
тут есть и статьи и примеры. найти нужный тебе кусок, в котором именно сериализация происходит - несложно, имхо...
Сериализация в классах - примеры, статьи
1
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
07.01.2012, 20:44  [ТС]
А как теперь сохранить сериализуемые данные? Чтобы при запуске их можно было сразу прочесть, тоесть прогресс работы с программой остался?
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
07.01.2012, 20:46
а ты как смотрел то, что там написано? ))) там и сохранение в файл и чтение из него:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        //сохраняем с помощью сериализации
        public void SaveListOfQuerys(string path)
        {
            FileStream filestream = new FileStream("file.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
            xmls.Serialize(filestream, sqlQueryList);
            filestream.Close();
        }
        //загружаем с помощью сериализации
        public void LoadListOfQuerys(string path)
        {
            FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
            XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
            sqlQueryList = (List<Query>)xmls.Deserialize(filestream);
            filestream.Close();
        }
0
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
07.01.2012, 23:09  [ТС]
Цитата Сообщение от znake Посмотреть сообщение
а ты как смотрел то, что там написано? ))) там и сохранение в файл и чтение из него:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        //сохраняем с помощью сериализации
        public void SaveListOfQuerys(string path)
        {
            FileStream filestream = new FileStream("file.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
            xmls.Serialize(filestream, sqlQueryList);
            filestream.Close();
        }
        //загружаем с помощью сериализации
        public void LoadListOfQuerys(string path)
        {
            FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
            XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
            sqlQueryList = (List<Query>)xmls.Deserialize(filestream);
            filestream.Close();
        }
В том то и беда, я не совсем понимаю логику последовательности и место когда и как применять этот класс.
Если просто скопировать в проект, то:
Ошибка Не удалось найти имя типа или пространства имен "Query" (пропущена директива using или ссылка на сборку?)
Query - это образно в даннном коде? Вместо него сериализуемый класс или.... или что? Заранее спасибо за терпение....
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
07.01.2012, 23:16
ну...фактически там сериализуются потом не Query, а List<Query>...но не суть. вообще да, Query это тот класс, объекты которого ты будешь сериализовать потом. хош назови его так, хош как-нить иначе - все в твоих руках. там лишь пример.
плюс к этому - там есть ссылки на статьи. тот пример делался на их основании. почитай, там дано немного теории.
1
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
09.01.2012, 12:50  [ТС]
Почитал, посмотрел полную форму откуда взят пример. По сериализации многое стало понятно. Вот появился немного иной вопрос, с таким кодом:

C#
1
2
3
4
5
6
7
8
9
//Добавление строки из текстбокса в листбокс и сохранение в нём, так же создание запроса Query
        private void button1_Click(object sender, EventArgs e)
        {
            Query newQuery = new Query();
            newQuery.name = textBox1.Text;
            listBox1.Items.Add(list);
            list.AddQuery(newQuery);
            textBox1.Text = null;
        }
тут создаётся "запрос", который потом сериализуется, пошёл от противного, сериализуется не список листбокса, а список запросов отражается в листбоксе. Но теперь сложность в отображении, во время работы программы, при добавлении нового запроса вместо самого текста показывается WindowsFormsAplication, а при новом запуске формы(при загрузке\дисериализации сохранённого списка) вместо WindowsFormsAplication отображается то, что было внесенно изначально. Как сделать "правильно", чтобы и в самой форме отображение было верным?
И ещё подскажите как можно обновить содержимое, чтобы и при удалении запроса на форме показывались актуальные данные?
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
09.01.2012, 13:18
Цитата Сообщение от Lovrentiy Посмотреть сообщение
Но теперь сложность в отображении, во время работы программы, при добавлении нового запроса вместо самого текста показывается WindowsFormsAplication, а при новом запуске формы(при загрузке\дисериализации сохранённого списка) вместо WindowsFormsAplication отображается то, что было внесенно изначально. Как сделать "правильно", чтобы и в самой форме отображение было верным?
честно говоря я не очень понимаю, что у тебя происходит. но, возможно, тебе надо поменять местами добавление в list и listBox:
C#
1
2
3
4
5
6
7
8
9
//Добавление строки из текстбокса в листбокс и сохранение в нём, так же создание запроса Query
        private void button1_Click(object sender, EventArgs e)
        {
            Query newQuery = new Query();
            newQuery.name = textBox1.Text;
            list.AddQuery(newQuery);
            listBox1.Items.Add(list);
            textBox1.Text = null;
        }
Цитата Сообщение от Lovrentiy Посмотреть сообщение
И ещё подскажите как можно обновить содержимое, чтобы и при удалении запроса на форме показывались актуальные данные?
в зависимости от того, как ты их туда запихиваешь. как вариант - просто очистить коллекцию в listBox, затем убрать ненужный элемент из list, а потом опять воткнуть list в коллекцию listBox'a.
0
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
09.01.2012, 14:26  [ТС]
Добавление:
C#
1
2
3
4
5
6
7
8
 //Добавление строки из текстбокса в листбокс и сохранение в нём, так же создание запроса Query
        private void button1_Click(object sender, EventArgs e)
        {
            Query newQuery = new Query();
            newQuery.name = textBox1.Text;
            list.AddQuery(newQuery);
            listBox1.Items.Add(list);
            textBox1.Text = null;
после нажатия форма выглядит такпервое вложение)
тоесть показывает некорректно

при удалении:
C#
1
2
3
4
5
 //удаление запроса из списка list
        private void button2_Click(object sender, EventArgs e)
        {
            list.RemoveQuery(list.ReturnQuerys(listBox1.SelectedIndex));           
        }
выглядит форма при нажатии удалить и выборе строки, так же! Тоесть на форме никаких изменений не происходит, но, при повторном открытии формы:
C#
1
2
3
4
5
6
7
 public Form1()
        {
            InitializeComponent();
            list.LoadListOfQuerys("file.xml");
            for (int i = 0; i < list.Count(); i++) listBox1.Items.Add(list.ReturnQuerys(i).name);
            
        }
удаление выбранной строки происходит.
Как прописать обновление листбокса на форме или как изменить способ вывода информации? Как согласовать list и listbox1 между собой?



Опять же, я использовал форму предложенную znake-ом в его теме о сериализации:
C#
1
2
3
4
 //удаляем запрос из списка
              public void RemoveQuery(Query query)
              {
                  sqlQueryList.Remove(query);
Но в этом случае, я могу удалить лишь ограниченное кол-во запросов из листбокса, фактически 1, как сделать чтобы мог удалять неограниченное кол-во строк?

для нагляндности весь код связанный с сериализацией:
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
63
64
65
66
67
68
69
 public class ListOfQuerys
          {
        
              private List<Query> sqlQueryList = new List<Query>();        
              //количество запросов в нашем списке
              public int Count()
              {
                  return sqlQueryList.Count;
              }
              //цепляем один конкретный запрос, если он нам нужен
              public Query ReturnQuerys(int i)
              {
                  return sqlQueryList.ElementAt(i);
              }
              //добавляем запрос в список
              public void AddQuery(Query query)
              {
                  sqlQueryList.Add(query);
              }
        //удаляем запрос из списка
              public void RemoveQuery(Query query)
              {
                  sqlQueryList.Remove(query);
              }
        //сохраняем с помощью сериализации
              public void SaveListOfQuerys(string path)
              {
                  FileStream filestream = new FileStream("file.xml", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                  XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
                  xmls.Serialize(filestream, sqlQueryList);
                  filestream.Close();
              }
              //загружаем с помощью сериализации
              public void LoadListOfQuerys(string path)
              {
                  FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
                  XmlSerializer xmls = new XmlSerializer(typeof(List<Query>));
                  sqlQueryList = (List<Query>)xmls.Deserialize(filestream);
                  filestream.Close();
              }
              //ищем конкретный запрос среди всех
              
              public Query FindQueryInList(string name)
              {
                  for (int i = 0; i < sqlQueryList.Count; i++)
                  {
                      if (sqlQueryList.ElementAt(i).name == name)
                      {
                          return sqlQueryList.ElementAt(i);
                      }
                  }
                  return null;
              }
          }
        ListOfQuerys list = new ListOfQuerys();
        
        //добавляем новый запрос в нашу коллекцию
        private void button4_Click(object sender, EventArgs e)
        {
            Query newQuery = new Query();
            newQuery.name = textBox1.Text;
          
            list.AddQuery(newQuery);
        }
               //сохраняем коллекцию с помощью сериализации
        private void button3_Click(object sender, EventArgs e)
        {
            list.SaveListOfQuerys("file.xml");
        }
 Комментарий модератора 
В этом разделе используем теги оформления кода CSHARP
(В панели инструментов кнопка C#)
Миниатюры
Как сериализовать значение listBox-а  
0
гроза ленивых студентов
 Аватар для znake
456 / 411 / 51
Регистрация: 27.03.2011
Сообщений: 823
09.01.2012, 15:22
tmi
выложи проект. поправлю то, что там не так. а то "многабукаф".
0
162 / 162 / 11
Регистрация: 07.09.2011
Сообщений: 995
09.01.2012, 16:19  [ТС]
Так мне суть надо понять =) МОжет выложить конкретный отрезок или весь проект? там впринципе кроме выложенного в той теме твоей про сериализацию, ничего и нет.
Можно переместиться в скайп, аску или личку, по твоему желанию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.01.2012, 16:19
Помогаю со студенческими работами здесь

Как из ListBox загнать значение в массив?
Ребят, как из listBox загнать значение в массив?

Как в ListBox увеличить значение RowSource
Имеются две формы одна которая отображает Listbox и кнопку, а вторая форма которая запускается с первой формы для добавления значений в...

Как вставить выбраное значение из ListBox в Label
Я создал список в ListBox, моя цель при нажатии на значение из ListBox'a поместить его в Label

Как в listBox поменять значение выбранного элемента
В ListBox выбран элемент, и есть некоторая строка как этому выбранному элементу присвоить значение имеющейся строки

Как вывести значение из ListBox по его индексу?
Подскажите. 1. Если в WindowsForm есть ListBox с несколькими значениями как можно по индексу вывести значение в TextBox. 2. Если...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 15.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru