Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
8 / 8 / 0
Регистрация: 07.07.2010
Сообщений: 154

Сериализация нескольких списков в один файл

09.05.2012, 00:42. Показов 4936. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется несколько списков:
C#
1
2
3
public static List<Photo> photos = new List<Photo>();
        public static List<Music> music = new List<Music>();
        public static List<Video> videos = new List<Video>();
Как все их сериализовать в один файл?
Для одного списка делаю так:
C#
1
2
3
4
XmlSerializer serializerPhoto = new XmlSerializer(typeof(List<Photo>));
            TextWriter textWriter = new StreamWriter(@"e:\db.xml");
            serializerPhoto.Serialize(textWriter, photos);
            textWriter.Close();
если сделать так:
C#
1
2
3
4
...
serializerPhoto.Serialize(textWriter, photos);
serializerPhoto.Serialize(textWriter, music);
...
то программа не запускается, вроде как блокируется доступ к файлу.

Добавлено через 1 час 24 минуты
Сделал запись вот так:
C#
1
2
3
4
5
6
7
8
9
Type[] personTypes = { typeof(List<Photo>), typeof(List<Music>) };
        object[] bla = { photos, music };
TextWriter textWriter = new StreamWriter(@"E:\db.xml");
            for (int i = 0; i < personTypes.Length; i++)
            {
                XmlSerializer serializerPhoto = new XmlSerializer(personTypes[i]);
                serializerPhoto.Serialize(textWriter, bla[i]);
            }
            textWriter.Close();
Но при чтении ошибка
C#
1
2
3
4
5
6
7
8
TextReader textReader = new StreamReader(@"E:\db.xml");
                for (int i = 0; i < personTypes.Length; i++)
                {
                    XmlSerializer deserializer = new XmlSerializer(personTypes[i]);
                    if (i == 0) bla[0] = (List<Photo>)deserializer.Deserialize(textReader);
                    if (i == 1) bla[1] = (List<Music>)deserializer.Deserialize(textReader);
                }
                    textReader.Close();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2012, 00:42
Ответы с готовыми решениями:

Сериализация нескольких объектов в один файл
Функция сериализуeт в xml,но ее я вызываю несколько раз ,как сделать ,чтобы инфа из xml не затералась ,а дозаписывалась в нее. public...

Сериализация в один файл
Здравствуйте! У меня есть три обьекта одного класса, которые я хочу сериализовать в один файл с помощю BinaryFormatter(и десериализовать...

Сериализация/десериализация папки с файлами и подпапками в один файл
Нужно сериализовать папку с файлами и подпапками в один файл(info.dat) и дисериализовать обратно со сохранением иерархии папок и файлов. ...

14
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 11:21
так же нужна помощь с чтением файла, знающие люди - откликнитесь
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 11:28
Цитата Сообщение от landan Посмотреть сообщение
Как все их сериализовать в один файл?
Засунь все списки в массив или список и сериализуй как один.
0
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 11:29
Цитата Сообщение от _script_ Посмотреть сообщение
Засунь все списки в массив или список и сериализуй как один.
а как их десериализовать причём каждый в свой List
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 11:53
Цитата Сообщение от tazer Посмотреть сообщение
а как их десериализовать причём каждый в свой List
тут четко помнить какой элемент каким был.

как то так:
C#
1
2
3
  array = (object[])deserializer.Deserialize(textReader);
   list1=(List<Photo>)array[0];
   list2=(List<Music>)array[1];
Добавлено через 2 минуты
Если одинаковый набор списков можно и в класс обернуть и тогда меньше проблем будет.
C#
1
2
3
4
5
6
7
class MyClass
{
       public static List<Photo> photos = new List<Photo>();
        public static List<Music> music = new List<Music>();
        public static List<Video> videos = new List<Video>();
 
}
И потом сериализовать и десериализировать объект класса.
0
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 13:00
Цитата Сообщение от _script_ Посмотреть сообщение
тут четко помнить какой элемент каким был.
вылезает ошибка.. как бы я не старался считывать всегда одно и тоже
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 13:04
Цитата Сообщение от tazer Посмотреть сообщение
вылезает ошибка.
Какой объект записан в файл?

Добавлено через 35 секунд
при сериализации что то некорректно записалось.
0
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 13:20
у меня есть 4 класса AnimalTip, ClassAnimal, GroupAnimal, FamilyAnimal
на их основе я создаю 4 листа
C#
1
2
3
4
List<AnimalTip> tipAnimalList = new List<AnimalTip>();
        List<ClassAnimal> classAnimalList = new List<ClassAnimal>();
        List<GroupAnimal> groupAnimalList = new List<GroupAnimal>();
        List<FamilyAnimal> familyAnimalList = new List<FamilyAnimal>();
заполняю их таким образом
C#
1
tipAnimalList.Add(new AnimalTip("Хордовые", "Тип вторичноротых животных, для которых характерно наличие энтодермального осевого скелета в виде хорды, которая у высших форм заменяется позвоночником. По строению и функции нервной системы тип хордовых занимает высшее место среди всех животных. В мире известно более 60 000 видов хордовых, в России — 4300 видов", "Вода, Суша"));
их у каждого по нескольку штук
сериализирую их так как показано выше
C#
1
2
3
4
5
6
7
8
9
10
FileStream stream = new FileStream(this.saveFileDialog1.FileName, FileMode.Create);
                    Type[] seril = { typeof(List<AnimalTip>), typeof(List<ClassAnimal>), typeof (List<GroupAnimal>), typeof (List<FamilyAnimal>) };
                    object[] ser = { tipAnimalList, classAnimalList, groupAnimalList, familyAnimalList };
                    TextWriter text = new StreamWriter(stream);
                    for (int i = 0; i < seril.Length; i++)
                    {
                        XmlSerializer serilaizer = new XmlSerializer(seril[i]);
                        serilaizer.Serialize(text, ser[i]);
                    }
                    text.Close();
в итоге вот
XML
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
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfAnimalTip xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AnimalTip>
    <Name_Tip>Хордовые</Name_Tip>
    <Inform>Тип вторичноротых животных, для которых характерно наличие энтодермального осевого скелета в виде хорды, которая у высших форм заменяется позвоночником. По строению и функции нервной системы тип хордовых занимает высшее место среди всех животных. В мире известно более 60 000 видов хордовых, в России — 4300 видов</Inform>
    <Habbitat>Вода, Суша</Habbitat>
  </AnimalTip>
  <AnimalTip>
    <Name_Tip>Членистоноогие</Name_Tip>
    <Inform>Тип первичноротых животных, включающий насекомых, ракообразных, паукообразных и многоножек. По количеству видов и распространённости может считаться самой процветающей группой живых организмов. Количество видов членистоногих превышает количество видов всех остальных животных, вместе взятых.</Inform>
    <Habbitat>Вода, Наземно-воздушная, Почва</Habbitat>
  </AnimalTip>
</ArrayOfAnimalTip><?xml version="1.0" encoding="utf-8"?>
<ArrayOfClassAnimal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ClassAnimal>
    <Name_Tip>Земноводные</Name_Tip>
    <Inform>Класс позвоночных четвероногих животных, в числе прочих включающий тритонов, саламандр, лягушек и червяг — всего более 6700 (по другим данным — около 5000) современных видов, что делает этот класс сравнительно немногочисленным. В России — 28 видов, на Мадагаскаре — 247 видов.</Inform>
    <Habbitat>Вода, Суша</Habbitat>
  </ClassAnimal>
  <ClassAnimal>
    <Name_Tip>Млекопитающие</Name_Tip>
    <Inform>Класс позвоночных животных, основной отличительной особенностью которых является вскармливание детёнышей молоком. Класс входит в кладу Synapsidomorpha надкласса четвероногих. По оценкам биологов, известно до 5500 современных видов млекопитающих, среди которых — и вид Человек разумный (лат. Homo sapiens); общее же число видов млекопитающих, включая вымершие, превышает 20 000. На территории России (2002) обитает до 380 видов.</Inform>
    <Habbitat>Наземно-воздушная, Водная, Почва</Habbitat>
  </ClassAnimal>
  <ClassAnimal>
    <Name_Tip>Паукообразные</Name_Tip>
    <Inform>Наиболее известные представители: пауки, скорпионы, клещи́. В настоящее время учёными описано более 114 тыс. видов паукообразных (включая 1,8 тыс. ископаемых видов; Zhang, 2013), большинство которых составляют пауки (более 44 тыс. видов) и клещи (более 55 тыс. видов)</Inform>
    <Habbitat>Суша</Habbitat>
  </ClassAnimal>
+ остальные классы
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 13:26
tazer,
попробуй, во первых, так сериализовать:

C#
1
2
3
 
XmlSerializer serilaizer = new XmlSerializer(typeof(object[]));
serilaizer.Serialize(text, ser);
0
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 13:32
попробуй, во первых, так сериализовать:
таким образом файл даже не создаётся
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 13:37
tazer, пришли проект. Так будет проще)
Сериализовать в любом случае надо одним объектом.

Упаковать в один класс надо.
0
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 13:42
_script_, держи
Архив WinRAR.rar
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 13:58
tazer, держи Иерархия животного мира.rar

В общем, сделал как я и говорил, упаковал в один класс
C#
1
2
3
4
5
6
7
    public class AllLists
        {
            public List<AnimalTip> tipAnimalList;
            public List<ClassAnimal> classAnimalList;
            public List<GroupAnimal> groupAnimalList;
            public List<FamilyAnimal> familyAnimalList;
        }

сериализация:
C#
1
2
3
4
5
6
7
8
9
10
11
 FileStream stream = new FileStream(this.saveFileDialog1.FileName, FileMode.Create);
                    TextWriter text = new StreamWriter(stream);
 
                    AllLists lists = new AllLists();
                    lists.classAnimalList = classAnimalList;
                    lists.familyAnimalList = familyAnimalList;
                    lists.groupAnimalList = groupAnimalList;
                    lists.tipAnimalList = tipAnimalList;
                    XmlSerializer serilaizer = new XmlSerializer(typeof(AllLists));
                    serilaizer.Serialize(text, lists);
                    text.Close();

десериализация:

C#
1
2
3
4
5
6
7
8
9
10
11
 FileStream stream = new FileStream(this.openFileDialog1.FileName, FileMode.Open);
                   
                    TextReader text = new StreamReader(stream);
                   
                    XmlSerializer deserializer = new XmlSerializer(typeof(AllLists));
                    AllLists lists = (AllLists)deserializer.Deserialize(text);
                    classAnimalList =lists.classAnimalList;
                    familyAnimalList=lists.familyAnimalList;
                    groupAnimalList = lists.groupAnimalList;
                    tipAnimalList=lists.tipAnimalList;       
                    text.Close();
вообще, можно убрать все эти поля и работать с объектом данного класса)
1
1 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 86
08.01.2015, 14:12
спасибо большое

Цитата Сообщение от _script_ Посмотреть сообщение
вообще, можно убрать все эти поля и работать с объектом данного класса)
так а если поубирать то заполнение treeView не пострадает?

всё отлично работает, ещё раз огромнейшее тебе спасибо
0
176 / 144 / 70
Регистрация: 01.05.2012
Сообщений: 414
08.01.2015, 14:15
tazer,
Цитата Сообщение от tazer Посмотреть сообщение
так а если поубирать то заполнение treeView не пострадает?
надо будет работать со списками через объект
C#
1
 lists.familyAnimalList;
вместо
C#
1
 familyAnimalList;

Не по теме:

Цитата Сообщение от tazer Посмотреть сообщение
спасибо большое
Кнопочка спасибо есть под сообщением)

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2015, 14:15
Помогаю со студенческими работами здесь

Как из двух списков сделать один список кортежей/списков
Доброго времени суток! Буду очень благодарен, если поможете из двух списков, к примеру a и b, сделать список c, который содержит пары...

Сериализация списков
У меня есть класс в котором находятся несколько списков мне нужно превратить экземпляр этого класса в байты. Через BinaryFormatter. Но при...

Объединение нескольких *.js в один файл
Например, есть плагин, который зависит от других плагинов и все они используется вместе часто. Можно ли существующие библиотеки ...

Печать нескольких RichBoxText в один файл
В общем воспользовался саппортом &quot;мелкомягких&quot; не знаю можно ссылку размещать или нет https://support.microsoft.com/ru-ru/kb/811401 ...

XML сериализация списков классов
Добрый день! Имею следующие классы public class Field { public string Type { get; set;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru