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

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

09.05.2012, 00:42. Показов 4988. Ответов 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
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru