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

Сериализация - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Расстановка ссылок в списке через цикл http://www.cyberforum.ru/cpp-beginners/thread808863.html
Помогите в реализации расстановки ссылок в списке через цикл. Не могу понять как сделать так, чтобы они друг на друга ссылались. #include <stdio.h> #include <string.h> struct Node { char data; Node *next; } flat =
C++ Строки Что не так, выбивает ошибку как на скрине, в warning и список ошибок - ничего нету char *str=new char ; cin.getline (str, 100); char *context=NULL; str = strtok_s(str, " ,.-;", &context); while (str != '\0') http://www.cyberforum.ru/cpp-beginners/thread808834.html
Массив: Создать массив чисел, полученных из элементов исходного по заданной формуле C++
задан массив {bi}:3,5;-0,66;4,3;0,005;0,6;-740;73;1;2,5; вычислить {zi} zi=(корень квадратный, под корнем b c индексом i в квадрате. i=1,...,9 Z с индексом i вывести на печать Будьте внимательны при выборе раздела форума
C++ Задачи по STL
Доброго времени суток, скачал себе учебник по STL, но в нем нет практических заданий, а теория без практики - плохо... если кто знает, подскажите сборник или книгу, заранее благодарю!:)
C++ Перегрузка оператора << http://www.cyberforum.ru/cpp-beginners/thread808809.html
Господа, у меня когнитивный диссонанс. При компиляции программы вылезает ошибка: "Ошибка 1 error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "const Word" (или приемлемое преобразование отсутствует) c:\program files (x86)\microsoft visual studio 11.0\vc\include\iterator 320" Хотя я явно описал функцию-перегрузку: ostream &operator <<( ostream &out, Word &word )...
C++ Как использовать класс описанный в другом файле Есть проект, несколько файлов, в одном из них описаны классы. Как использовать эти классы в других файлах? подробнее

Показать сообщение отдельно
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
14.03.2013, 22:09     Сериализация
таким макаром можно только POD типы сериализовывать\десериализовывать.
строки и вектора к ним не относятся. чтобы понять почему, нарисуем себе такой класс, в котором есть указатель на что-то (в строках и векторах присутствует подобный указатель). Ну будем придираться к отсутствию всяких правильных конструкторов копирования и операторов = и прочих деталей, которые к сути сейчас не имеют отношения
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
class Foo
{
   int* m_ptr;
 
public:
   Foo()
    : m_ptr(new int(666));
   {
   }
 
   ~Foo()
   {
       delete m_ptr;
   }
};
 
sizeof(Foo) >= sizeof(int*);
 
где-то в коде:
{
  Foo foo;
  // внутри foo под указатель была выделена память. в нее записали 666
  // пусть этот указатель указывает на ячейку c адресом 0xf0f0f0f0;
  // тут сериализация как у вас:
  stream.write(&foo, sizeof(foo));
  //т.е. тут в стрим записались как минимум 4 байта. значение 0xf0f0f0f0
  //далее происходит выход из области видимости, вызывается деструктор foo,
  //память по адресу 0xf0f0f0f0 освобождается и ее больше использовать нельзя.
}
 
{
   // В другом месте хотим десериализовать.
   Foo foo;
   // Вот тут снова внутри foo выделяется память и m_ptr указывает на ячейку 0xa0a0a0a0;
   // А тут мы десериализовываем:
   stream.read(&foo, sizeof(foo));
   // Что тут происходит. Тут перезаписываются все внутренние поля foo. В нашем случае  у нас только
   // указатель который до десериализации указывал на правильно выделенную память 0xa0a0a0a0,
   // а после десериализации будет указывать на 0xf0f0f0f0, которая уже была удалена и в которой
   // может быть всякий хлам или которую уже заюзал кто-то другой. Т.е. имеем проблему.
}
При такой сериализации не сохраняется значение 666, как можно было бы подумать. Сохраняется адрес ячейки, где хранится это число 666 и в какой-то момент этот адрес становится недействительным.
Поэтому для таких классов нужно писать специальные функции сериализации/десериализации.
 
Текущее время: 14:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru