С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2

Вопросы сериализации

12.11.2012, 20:32. Показов 2009. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Ноги здесь: Везде говорится, что структуры и классы отличаются только типом доступа к членам по умолчанию


Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, если вы возьмёте свой код и замените в нём слово class на struct, то увидите, что свойство сохраняется. Сложные данные, требующие собственной логики копирования, никогда правильно скопированы не будут, ни в структуре, ни в классе.
Кстати, по этой теме. А если мне надо загнать довольно сложный класс в массив байт, что бы потом его сохранить в файл. Есть ли какие-то стандартные инструменты кроме класса для работы с JSON. JSON просто текстом сохраняет, а там может быть много разных данных, некрасиво получится.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2012, 20:32
Ответы с готовыми решениями:

Метод сериализации
Помогите найти пинфу по Методу сериализации

Поясните по сериализации
В boost::serialization Нужно слить мап в файл. Простите за тупой вопрос, но нужно прописывать сериализацию для каждого класса...

По поводу сериализации
Может кто-то объяснить, в чем разница между сериализацией, маршаллингом и методами write/read из std::ofstream/std::ifstream?

22
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:34
НеСказочник, нет, стандартных, к сожалению, нет. Можно воспользоваться, например, boost::serialization. Али закатать рукава и написать собственный сериализатор (и убиться ). Да и на счёт класса для работы с JSON что-то я сомневаюсь. Нет такого в стандарте.
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 20:35  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, нет, стандартных, к сожалению, нет. Можно воспользоваться, например, boost::serialization. Али закатать рукава и написать собственный сериализатор (и убиться ). Да и на счёт класса для работы с JSON что-то я сомневаюсь. Нет такого в стандарте.
А я, вроде бы, находил, правда в .Net
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:37
НеСказочник, ну, дотнет к языку С++ мало отношения имеет. И я почти уверен, что там есть своя сериализация.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 20:37
Цитата Сообщение от НеСказочник Посмотреть сообщение
А я, вроде бы, находил, правда в .Net
ну .Net и c++ далеко друг от друга
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 20:38  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
ну .Net и c++ далеко друг от друга
Visual C++ 2008
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:39
НеСказочник, ещё раз, язык С++ и франкенштейн майкрософтовский далековато друг от друга.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 20:39
Цитата Сообщение от НеСказочник Посмотреть сообщение
Visual C++ 2008
А причем здесь это? C++ и C++/CLI(.Net) разные вещи
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 20:41  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А причем здесь это? C++ и C++/CLI(.Net) разные вещи
Мне главное экземпляр класса сохранить. Целиком. Что бы потом можно было создать другой экземпляр этого же класса и забить в него всю ту же информацию.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:42
НеСказочник, вам надо сохранять экземпляры разных классов? Или задача про конкретный класс/небольшую иерархию? Если так, можно действительно свою простенькую сериализацию замутить.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 20:44
Цитата Сообщение от НеСказочник Посмотреть сообщение
Что бы потом можно было создать другой экземпляр этого же класса и забить в него всю ту же информацию.
Может легче "закатать" в фаил значения всех полей класса, а потом их загружать?
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 20:45  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, вам надо сохранять экземпляры разных классов? Или задача про конкретный класс/небольшую иерархию? Если так, можно действительно свою простенькую сериализацию замутить.
Есть класс, в котором хранится куча полей, среди которых есть списки экземпляров других классов, которые тоже собою не просты. Классы, естественно, известны и при сохранении и при открытии. Я только не знаю как такую кучу всего запихнуть в массив байт, что бы потом записать в файл или отправить в stream.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:48
Croessmah, если поля нетривиальные и сами являются классами со сложной внутренней структурой - не легче. Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора, ведь если используется виртуальное наследование или позднее связывание, одному компилятору известно, где в классе будет лежать таблица виртуальных функций/классов и прочие тонкости реализации.

Добавлено через 1 минуту
НеСказочник, тогда действительно лучше воспользоваться сторонними реализациями алгоритмов сериализации, бустовской, например. Аль в дотнете пошарить, я уверен, там это есть (в шарпе сериализация точно есть).
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 20:50  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Croessmah, если поля нетривиальные и сами являются классами со сложной внутренней структурой - не легче. Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора, ведь если используется виртуальное наследование или позднее связывание, одному компилятору известно, где в классе будет лежать таблица виртуальных функций/классов и прочие тонкости реализации.
И компилятор и программа и всё остальное одинаковое. Просто я хочу сегодня, например, сохранить сессию работы с программой, целиком как есть. А при следующем запуске загрузить. Эта штука описывается классом, в котором так же много чего другого. И это всё я в последствии буду дописывать, но переделывать каждый раз проседуру сохранения совершенно не хочется, хотя я понимаю, что в новых версиях этого класса старые открываться не будут из-за разных членов класса.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 20:54
Цитата Сообщение от silent_1991 Посмотреть сообщение
Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора
А с динамически выделенными объектами сериализатор справиться(точнее десериализатор)?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 20:56
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 21:01
Цитата Сообщение от silent_1991 Посмотреть сообщение
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
Просто я не разу этим не занимался, поэтому вопрос такой:
Есть объект A, в котором есть массив указателей на объекты класса B, выделенные в динамической памяти.
При сохранении объекта A указатели же будут сохранены?
0
60 / 48 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
12.11.2012, 21:09  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Просто я не разу этим не занимался, поэтому вопрос такой:
Есть объект A, в котором есть массив указателей на объекты класса B, выделенные в динамической памяти.
При сохранении объекта A указатели же будут сохранены?
Кстати, а вот мне щас стало интересно, а ведь это же разные задачи:

- Сохранить экземпляр класса A с указателями на экземпляры класса B (при условии, что экземпляры класса B где-то сохраняются)


- Или сохранить Экземпляр класса A вместе с экземплярами класса B, а при распаковке поставить на место, как было.

Добавлено через 4 минуты
Во, во. Вроде бы нащёл: http://msdn.microsoft.com/ru-r... atter.aspx

Если я правильно понял описание, то эта штука может запихнуть в поток кого угодно и не подавится.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
12.11.2012, 21:20
Croessmah, зачем? Я же наоборот говорю, о простом переводе объекта в массив байтов и речи быть не может. При сохранении объекта, лежащего в динамической памяти, надо сохранять само состояние этого объекта (рекурсивно, если в объекте тоже есть данные, выделенные динамически - сохраняем эти данные, а не указатель). Т.е. например имеем класс:
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
class Foo
{
    // ...
private:
    int a;
};
 
class Moo
{
    // ...
private:
    int data1;
    double data2;
    char data3;
};
 
class Bar
{
    // ...
private:
    Foo **foo_arr;
    int foo_arr_size;
    Moo data;
};
Экземпляр класса Bar (в текстовом представлении) стоит сохранить примерно так:
Code
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
type : Bar
fields_start
    type : Foo[<foo_arr_size>]
    arr_start
        type : Foo
        fields_start
            type : int
            value : <a>
        fields_end
        type : Foo
        fields_start
            type : int
            value : <a>
        fields_end
        ...
        type : Foo
        fields_start
            type : int
            value : <a>
        fields_end
    arr_end
    type : Moo
    fields_start
        type : int
        value : <data1>
        type : double
        value : <data2>
        type : char
        value : <data3>
    fields_end
fields_end
Это такой упрощённый вариант для конкретного случая. Сначала идёт тип объекта. Если объект скалярного типа, следом просто идёт значение. Если нетривиальный - идёт список полей. Как видно, пара "двойной указатель-размер" в данном случае интерпретируется как массив указателей на объекты класса. Соответственно каждый элемент массива - объект класса. Он полноценно сериализуется (со списокм поле и т.д.). В простейшем случае можно было бы опустить тип каждого элемента, но когда в дело вступает наследование, там уже надо учитывать тип всегда.
Вот как-то так. Очень похоже на XML, что не удивительно, ведь XML-представление объектов - один из способов сериализации.

Добавлено через 2 минуты
НеСказочник, да, судя по всему, оно и есть.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
12.11.2012, 21:22
Цитата Сообщение от silent_1991 Посмотреть сообщение
При сохранении объекта, лежащего в динамической памяти, надо сохранять само состояние этого объекта (рекурсивно, если в объекте тоже есть данные, выделенные динамически - сохраняем эти данные, а не указатель)
Вот об этом я и спрашивал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2012, 21:22
Помогаю со студенческими работами здесь

Ищу литературу по интерфейсам, делегатам, сериализации и т.п. применительно к C++
Добрый вечер. Подскажите, есть ли какая литература по интерфейсам, делегатам, сериализации и т.д., как и когда их применять на практике, но...

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6 вопросов). Так вот когда вопросы кончаются...

Ошибка сериализации
Здравствуйте! Приложение выбрасывает исключение и я не могу понять почему:В месте: lock (sLock) { bmp =...

По поводу сериализации
Когда я сериализую обьект, в котором вложены другие объекты разных типов классов, а потом его десериализую и присваиваю новому обьекту (как...

Подобие сериализации
Привет!Вот я прохожу сервис жавараш,на уровне -сериализация.Там сперва учат как просто сохранить объект в файл.Таким образом Сегодня мы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru