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

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

12.11.2012, 20:32. Показов 2044. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
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-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru