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

Сериализация объекта

10.01.2017, 08:33. Показов 2377. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Мне нужно сериализавать объект то есть создать бинарный файл, проблема в том что я хочу до записывать одинаковые объекты в этот файл а потом при необходимости считывать объекты по одному. Структура самого объекта будет всегда одинакова. Вопрос это вообще возможно и если возможно то объясните как?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2017, 08:33
Ответы с готовыми решениями:

Сериализация объекта
public class UserObject { public string variable1{ get; set; } public LibraryType variable2{ get; set;...

Сериализация объекта
Доброго времени суток. Есть объект, нужно сериализовать его и записать в файл: сериализовали - записали, сериализовали - записали. Можно...

Сериализация объекта
У меня есть абстрактный метод: public abstract void save(); Вот его одна из вариаций переопределения public override void save()...

5
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
10.01.2017, 08:59
Graf1385, простой пример
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
class Program
{
    static void Main(string[] args)
    {
        List<A> a = new List<A>();
        a.Add(new A() { a = 1 });
        a.Add(new A() { a = 2 });
        // ...
 
        string path = @"D:\file.bin";
 
        if (!File.Exists(path))
            File.Create(path).Close();
 
        // Сериализация
        using (MemoryStream ms = new MemoryStream())
        {
            new BinaryFormatter().Serialize(ms, a);
            using (FileStream fs = new FileStream(path, FileMode.Open))
            {
                byte[] buffer = ms.GetBuffer();
                fs.Write(buffer, 0, buffer.Length);
            }
        }
 
 
        // Десериализация
        List<A> b = new List<A>();
        using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(path)))
        {
            b = (List<A>)new BinaryFormatter().Deserialize(ms);
        }
        foreach (A c in b)
            Console.Write(c.a + " ");
      
 
        Console.ReadKey();   
    }
}
 
[Serializable]
class A
{
    public int a;
}
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
10.01.2017, 09:27  [ТС]
У тебя тут коллекция объектов а мне нужно именно один объект. Объясню почему. Твой способ сериализации мне подходит а именно сериализовать объект в память а потом добавить массив байт в файл. А вот с десериализацией не получиться так как ты объём из файла десириализуешь в коллекцию а если этот файл будет весить 500mb или ещё больше а он будет весить очень много. Вот как мне десериализовать по одному объекту?

Добавлено через 1 минуту
За способ сериализации спасибо я его обязательно применю.
0
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
10.01.2017, 10:17
Лучший ответ Сообщение было отмечено Graf1385 как решение

Решение

Graf1385, тогда можно сериализовать по одному объекту
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
    static void Main(string[] args)
    {
        List<A> list = new List<A>();
        list.Add(new A() { a = 1 });
        list.Add(new A() { a = 2 });
        // ...
 
        string path = @"D:\file.bin";
 
        if (!File.Exists(path))
            File.Create(path).Close();
 
        // Сериализация
        using (FileStream fs = new FileStream(path, FileMode.Open))
            foreach (A a in list)
                new BinaryFormatter().Serialize(fs, a);
 
        // Десериализация
        A b = new A();
        using (FileStream fs = new FileStream(path, FileMode.Open))
            b = (A)new BinaryFormatter().Deserialize(fs); 
 
        Console.Write(b.a + " ");
        Console.ReadKey();   
    }
Добавлено через 15 минут
Пример выше считывает первую запись, если нужно считывать конкретную запись, то можно сделать так:
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
static void Main(string[] args)
{
    List<A> list = new List<A>();
    list.Add(new A() { a = 1 });
    list.Add(new A() { a = 2 });
    // ...
 
    string path = @"D:\file.bin";
 
    if (!File.Exists(path))
        File.Create(path).Close();
 
    // Сериализация
    using (FileStream fs = new FileStream(path, FileMode.Open))
        foreach (A a in list)
            new BinaryFormatter().Serialize(fs, a);
 
    // Десериализация
    A b = new A();
    int size = 0;
    using (FileStream fs = new FileStream(path, FileMode.Open))
    {
        // не забудь учесть возможность отсутствия объектов в листе (деление на 0)
        size = (int)fs.Length / list.Count; // размер сериализованного объекта в файле
        // size нужно умножить на индекс объекта, который хотим достать
        // size * 0 - первый объект, size * 1 - второй...
        fs.Seek(size, SeekOrigin.Begin); 
        b = (A)new BinaryFormatter().Deserialize(fs);
    }
 
    Console.Write(b.a + " ");
    Console.ReadKey();   
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 1
10.01.2017, 10:34
Цитата Сообщение от Pikemaster Посмотреть сообщение
C#
1
size = (int)fs.Length / list.Count; // размер сериализованного объекта в файле
Важное уточнение - так можнл делать только для объектов фиксированного размера. Если в классе есть поле типа string, то такой подход применять уже нельзя. Можно создать дополнительный index файл где будут записаны смещения внутри файла для каждого объекта.
1
309 / 309 / 215
Регистрация: 24.09.2013
Сообщений: 771
10.01.2017, 10:46
OwenGlendower, действительно важное.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Можно создать дополнительный index файл где будут записаны смещения внутри файла для каждого объекта.
Еще можно фиксировать размеры расширяемых полей (если это возможно и допускается)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2017, 10:46
Помогаю со студенческими работами здесь

Сериализация методов объекта
Добрый день! Только-только начал изучать сериализацию. И первое, что бросилось при прочтении тем и материалов об этом, везде (и при...

Сериализация объекта с делегатом
Есть класс, есть делегат. public delegate void WordDelegate(); public class Word { public...

Глубокая сериализация объекта
По учебнику, для того что бы сделать глубокую управляемую сериализацию объекта класса А(поле объекта - объект другого класса В)...

Работа с классом: сериализация объекта
Здравствуйте. Решил попробовать сериализовать объект. SendDocumentResponse response1 = new SendDocumentResponse(); ...

Сериализация объекта для передачи по сети
Здравствуйте многоуважаемые форумчане. Взываю к вам, ибо ответа найти я не могу =( В шарпы пришел из С, и сейчас надо переделать...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru