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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
#1

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

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

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


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

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

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

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

Вопросы по C++ - C++
Хочу учиться писать программы на C++, и у меня несколько вопросов 1) Этот язык такой же сложный, как Ассемблер? Например, Паскаль мне...

Вопросы по C++ - C++
Всем привет! У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них. 1) Как...

Вопросы по C++ - C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как можно в пхп? Приведу пример: php:...

22
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.11.2012, 20:56 #16
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
0
Croessmah
Эксперт CЭксперт С++
13413 / 7564 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 21:01 #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Croessmah, почему нет? Если придать типу условное обозначение (некий бинарный идентификатор), по которому десериализатор сможет восстановить тип объекта, он сможет и память под него выделить. А уж данными её заполнить не проблема - читай и читай себе набор байтов из файла.
Просто я не разу этим не занимался, поэтому вопрос такой:
Есть объект A, в котором есть массив указателей на объекты класса B, выделенные в динамической памяти.
При сохранении объекта A указатели же будут сохранены?
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 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

Если я правильно понял описание, то эта штука может запихнуть в поток кого угодно и не подавится.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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 минуты
НеСказочник, да, судя по всему, оно и есть.
1
Croessmah
Эксперт CЭксперт С++
13413 / 7564 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
12.11.2012, 21:22 #20
Цитата Сообщение от silent_1991 Посмотреть сообщение
При сохранении объекта, лежащего в динамической памяти, надо сохранять само состояние этого объекта (рекурсивно, если в объекте тоже есть данные, выделенные динамически - сохраняем эти данные, а не указатель)
Вот об этом я и спрашивал
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
12.11.2012, 21:28  [ТС] #21
Кстати, я щас вспомнил, что в стареньком Turbo pascal была таки стандартная сериализация. По крайней мере экземпляры сложных структур я там сохранял в файл буквально парой движений. Интересно, почему в C такого не предусмотрели? Потоки ведь есть. Не ужели настолько хотели облегчить, что даже это посчитали лишним?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.11.2012, 21:36 #22
НеСказочник, не уж то и объекты, выделенные динамически, сохранялись?
Вообще объекты, типы которых не используют виртуальность (в наследовании и в полиморфизме), которые не содержат выделенных динамически данных (или статических данных, содержащих динамические данные), в общем, объекты, которые полностью (рекурсивно, если можно так выразиться) лежат в автоматической памяти, можно перевести в поток байтов так:

C++
1
char *simple_object_bytes = reinterpret_cast<char *>(&simple_object);
Размер такого байтового массива будет sizeof(simple_object). Восстановить такой объект можно через memcpy, например.

Добавлено через 2 минуты
Но это тоже компиляторозависимо. Кто его знает, как там компилятор перетасует поля объектов. В общем, лучше всего использовать универсальные алгоритмы сериализации. Для передачи по сети, например, лучше перегонять в поток байтов. А для сохранения состояния объекта на диск можно ограничиться и переводом в XML.
0
НеСказочник
58 / 46 / 8
Регистрация: 12.11.2012
Сообщений: 356
Записей в блоге: 2
12.11.2012, 21:39  [ТС] #23
Цитата Сообщение от silent_1991 Посмотреть сообщение
НеСказочник, не уж то и объекты, выделенные динамически, сохранялись?
Вообще объекты, типы которых не используют виртуальность (в наследовании и в полиморфизме), которые не содержат выделенных динамически данных (или статических данных, содержащих динамические данные), в общем, объекты, которые полностью (рекурсивно, если можно так выразиться) лежат в автоматической памяти, можно перевести в поток байтов так:

C++
1
char *simple_object_bytes = reinterpret_cast<char *>(&simple_object);
Размер такого байтового массива будет sizeof(simple_object). Восстановить такой объект можно через memcpy, например.
Там можно было создать/открыть файл тремя способами:
- текстовый. Сохраняется текст. Ничего нового.
- бинарный. Опять ничего нового. Массив байт.
- Типовой. При создании объекта, обеспечивающего сохранение файла ему нужно передать тип. Что передадите с тем и работает.


Нам ещё тогда в универе (тогда я ещё учился) на вопросы "Как читать файл?" препод отвечал "А как писали, так и читайте."
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 21:39
Привет! Вот еще темы с ответами:

Вопросы!!! - C++
прошу посоветовать что почитать чтобы ответить на следующие вопросы!!(можно ответить ссылками) если будут промеры по теме буду рад:) ...

Вопросы - C++
Здравствуйте! 1. Как сделать так, чтобы программа (функция (strlen() ) не считала пробелы? 2. Можно ли упростить (сократить)...

Вопросы по С++ - C++
1) Чем отличается const *char от сhar при использовании в программах? 2) Тип void * так и не понял как и что с ним делать. Видел в...

Вопросы - C++
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали, там набор математич. формул и теория, а...


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

Или воспользуйтесь поиском по форуму:
23
Yandex
Объявления
12.11.2012, 21:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru