Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 1
Регистрация: 22.10.2012
Сообщений: 47
1

Запись экземпляров класса или структур в файл

09.09.2014, 15:05. Показов 829. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Подскажите пожалуйста с записью структур или экземпляров классов в файл. Нашёл пару статей, посвящённых сериализации, попробовал, вроде примерно понятно. Можно записать целиком или отдельный экземпляр или даже целый список или массив, если указать атрибут сериализации. Ниже приведу код, который понаписал, там, в общем-то, практически всё по примеру с минимумом наворотов.
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication2
{
    [SerializableAttribute]
    struct item
    {
        public string stroka;
        public int integ;
        public double dbl;
        public item(int i): this() 
        {
            integ = 0;
            stroka = null;
            dbl = 0; 
        }
    };
 
    [SerializableAttribute]
    class cl
    {
        private int a;
        private string str;
        public int get_a() { return a; }
        public string get_s() { return str; }
        public void set_a(int i) {a=i;}
        public void set_s(string s) {str=s;}
        public cl() {a=10; str="Hello!";}
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Green; 
            item I=new item(1);
            I.dbl=2.7; I.integ=7; I.stroka="Message";
            cl C = new cl();
            C.set_a(100500); C.set_s("Hello, World!");
            FileStream FW=new FileStream("newfile", FileMode.Create, FileAccess.Write);
            BinaryFormatter bw = new BinaryFormatter(); 
            bw.Serialize(FW, I);
            bw.Serialize(FW, C);
            FW.Close();
 
            int i = 0; double d = 0; string s = null;
            BinaryFormatter br = new BinaryFormatter();
            FileStream FR = new FileStream("newfile", FileMode.Open, FileAccess.Read);
            item result = new item(2);
            cl end = new cl();
            result = (item)br.Deserialize(FR);
            end = (cl)br.Deserialize(FR);
            FR.Close();
            Console.WriteLine(result.integ +"\n" + result.dbl +"\n" +result.stroka +"\n");
            Console.WriteLine(end.get_a() + "\n" + end.get_s() + "\n");
            Console.ReadKey(true);
        }
    }
}

Но вот возникло пара вопросов: а как в данном случае считать только второй записанный объект, т.е. экземпляр класса cl, не считывая структуру item? В С++ можно было, зная размер структуры в байтах, сместиться с помощью fseek и считать уже необходимый элемент (нужное количество байт), а не добираться до него считывая всё, что стоит перед ним. И как быть, если правда пишется массив/список другой набор различных экземпляров класса, например, список учащихся, и потребовалось изменить 5-й из 10-ти объектов? Опять же, на С++ просто сместился бы на нужное число байт, перезаписал необходимый кусочек и всё. А тут я, честно, не знаю даже никаких команд для этого. Пока, как я понял, десериализация работает именно последовательно, считывая одно за другим. Да и с sizeof беда, нельзя, как в плюсах узнать размер структуры (да, знаю, что можно и НУЖНО сложить размеры всех имеющихся внутри структуры элементов, вот и получу размер). В общем, кому не сложно, можете показать, как на Шарпе работать с sizeof и как считать/переписать в файле нужный объект, не считывая всё подряд. Ну или ткните в хороший мануал, что тоже неплохо. В книгах примеры ограничиваются на: запишем одну букву (char c='a') в файл >_<

Добавлено через 15 минут
Нда. Нашёл, как использовать seek на C#, вопрос разрешился, тема утратила смыл.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2014, 15:05
Ответы с готовыми решениями:

Запись в файл экземпляров класса
Добрый день. Имеется 2 класса и, соответственно, их экземпляры. public class baseConPrototype...

Динамический массив экземпляров класса, с неизвестным количеством экземпляров
Доброго времени суток. По ходу работы, программно должны создаваться и удаляться объекты класса....

Запись структур в файл
можно ли сделать так что бы структуру base, которую нужно записать несколько раз в файл а потом...

Запись структур в файл
Доброго всем времени суток.:dance: Обращаюсь к вам с таким вопросом : Взяв за основу Задача 2...

0
09.09.2014, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2014, 15:05
Помогаю со студенческими работами здесь

Запись структур в файл
У меня есть файл и масив структур. Надо реализовать запись и чтения файла. Можна ли сделать так:...

Запись структур в файл
Здравствуйте! Имеется структура struct user { char login; char password; }; Записываю...

Запись структур в файл
Здравствуйте! Необходимо записывать структуры, состоящие из QString и int в бинарники, а также...

Запись массива структур в файл
Запись массива структур в файл так, что бы потом можно было считывать, удалять ненужные записи,...


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

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