Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:32     Вопросы сериализации #1
 Комментарий модератора 
Ноги здесь: Везде говорится, что структуры и классы отличаются только типом доступа к членам по умолчанию


Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, если вы возьмёте свой код и замените в нём слово class на struct, то увидите, что свойство сохраняется. Сложные данные, требующие собственной логики копирования, никогда правильно скопированы не будут, ни в структуре, ни в классе.
Кстати, по этой теме. А если мне надо загнать довольно сложный класс в массив байт, что бы потом его сохранить в файл. Есть ли какие-то стандартные инструменты кроме класса для работы с JSON. JSON просто текстом сохраняет, а там может быть много разных данных, некрасиво получится.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2012, 20:32     Вопросы сериализации
Посмотрите здесь:

C++ Вопросы
C++ Вопросы
Житейские вопросы по С++ C++
C++ Вопросы по C++
Вопросы по С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:34     Вопросы сериализации #2
НеСказочник, нет, стандартных, к сожалению, нет. Можно воспользоваться, например, boost::serialization. Али закатать рукава и написать собственный сериализатор (и убиться ). Да и на счёт класса для работы с JSON что-то я сомневаюсь. Нет такого в стандарте.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:35  [ТС]     Вопросы сериализации #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, нет, стандартных, к сожалению, нет. Можно воспользоваться, например, boost::serialization. Али закатать рукава и написать собственный сериализатор (и убиться ). Да и на счёт класса для работы с JSON что-то я сомневаюсь. Нет такого в стандарте.
А я, вроде бы, находил, правда в .Net
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:37     Вопросы сериализации #4
НеСказочник, ну, дотнет к языку С++ мало отношения имеет. И я почти уверен, что там есть своя сериализация.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 20:37     Вопросы сериализации #5
Цитата Сообщение от НеСказочник Посмотреть сообщение
А я, вроде бы, находил, правда в .Net
ну .Net и c++ далеко друг от друга
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:38  [ТС]     Вопросы сериализации #6
Цитата Сообщение от Croessmah Посмотреть сообщение
ну .Net и c++ далеко друг от друга
Visual C++ 2008
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:39     Вопросы сериализации #7
НеСказочник, ещё раз, язык С++ и франкенштейн майкрософтовский далековато друг от друга.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 20:39     Вопросы сериализации #8
Цитата Сообщение от НеСказочник Посмотреть сообщение
Visual C++ 2008
А причем здесь это? C++ и C++/CLI(.Net) разные вещи
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:41  [ТС]     Вопросы сериализации #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А причем здесь это? C++ и C++/CLI(.Net) разные вещи
Мне главное экземпляр класса сохранить. Целиком. Что бы потом можно было создать другой экземпляр этого же класса и забить в него всю ту же информацию.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:42     Вопросы сериализации #10
НеСказочник, вам надо сохранять экземпляры разных классов? Или задача про конкретный класс/небольшую иерархию? Если так, можно действительно свою простенькую сериализацию замутить.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 20:44     Вопросы сериализации #11
Цитата Сообщение от НеСказочник Посмотреть сообщение
Что бы потом можно было создать другой экземпляр этого же класса и забить в него всю ту же информацию.
Может легче "закатать" в фаил значения всех полей класса, а потом их загружать?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:45  [ТС]     Вопросы сериализации #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, вам надо сохранять экземпляры разных классов? Или задача про конкретный класс/небольшую иерархию? Если так, можно действительно свою простенькую сериализацию замутить.
Есть класс, в котором хранится куча полей, среди которых есть списки экземпляров других классов, которые тоже собою не просты. Классы, естественно, известны и при сохранении и при открытии. Я только не знаю как такую кучу всего запихнуть в массив байт, что бы потом записать в файл или отправить в stream.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:48     Вопросы сериализации #13
Croessmah, если поля нетривиальные и сами являются классами со сложной внутренней структурой - не легче. Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора, ведь если используется виртуальное наследование или позднее связывание, одному компилятору известно, где в классе будет лежать таблица виртуальных функций/классов и прочие тонкости реализации.

Добавлено через 1 минуту
НеСказочник, тогда действительно лучше воспользоваться сторонними реализациями алгоритмов сериализации, бустовской, например. Аль в дотнете пошарить, я уверен, там это есть (в шарпе сериализация точно есть).
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 20:50  [ТС]     Вопросы сериализации #14
Цитата Сообщение от silent_1991 Посмотреть сообщение
Croessmah, если поля нетривиальные и сами являются классами со сложной внутренней структурой - не легче. Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора, ведь если используется виртуальное наследование или позднее связывание, одному компилятору известно, где в классе будет лежать таблица виртуальных функций/классов и прочие тонкости реализации.
И компилятор и программа и всё остальное одинаковое. Просто я хочу сегодня, например, сохранить сессию работы с программой, целиком как есть. А при следующем запуске загрузить. Эта штука описывается классом, в котором так же много чего другого. И это всё я в последствии буду дописывать, но переделывать каждый раз проседуру сохранения совершенно не хочется, хотя я понимаю, что в новых версиях этого класса старые открываться не будут из-за разных членов класса.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 20:54     Вопросы сериализации #15
Цитата Сообщение от silent_1991 Посмотреть сообщение
Если же речь о простом переводе класса в бинарный поток, то об этом и речи быть не может в общем случае и с сохранением независимости от компилятора
А с динамически выделенными объектами сериализатор справиться(точнее десериализатор)?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 20:56     Вопросы сериализации #16
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 21:01     Вопросы сериализации #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
Просто я не разу этим не занимался, поэтому вопрос такой:
Есть объект A, в котором есть массив указателей на объекты класса B, выделенные в динамической памяти.
При сохранении объекта A указатели же будут сохранены?
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
12.11.2012, 21:09  [ТС]     Вопросы сериализации #18
Цитата Сообщение от Croessmah Посмотреть сообщение
Просто я не разу этим не занимался, поэтому вопрос такой:
Есть объект A, в котором есть массив указателей на объекты класса B, выделенные в динамической памяти.
При сохранении объекта A указатели же будут сохранены?
Кстати, а вот мне щас стало интересно, а ведь это же разные задачи:

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


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

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

Если я правильно понял описание, то эта штука может запихнуть в поток кого угодно и не подавится.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2012, 21:20     Вопросы сериализации #19
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 (в текстовом представлении) стоит сохранить примерно так:
Код
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 минуты
НеСказочник, да, судя по всему, оно и есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 21:22     Вопросы сериализации
Еще ссылки по теме:

C++ Вопросы по C++
Вопросы по C++ C++
C++ Метод сериализации

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
12.11.2012, 21:22     Вопросы сериализации #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
При сохранении объекта, лежащего в динамической памяти, надо сохранять само состояние этого объекта (рекурсивно, если в объекте тоже есть данные, выделенные динамически - сохраняем эти данные, а не указатель)
Вот об этом я и спрашивал
Yandex
Объявления
12.11.2012, 21:22     Вопросы сериализации
Ответ Создать тему
Опции темы

Текущее время: 01:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru