Сериализация объектов кусками
От: sch  
Дата: 19.10.05 13:02
Оценка: +1
Ну, раз уж такое дело пошло и нас учат корректно запрещать создавать объекты в стеке, я тоже свои пять копеек оставлю.

Итак, есть класс A:
[c++]
struct A: virtual some_base_class, some_other_class {
virtual f();
};
[/c++]

При записи берем и пишем объект этого класса целиком в поток:
[c++]
A *a = new A();
...
stream.write((const char *) a, sizeof(A));
[/c++]

Теперь, внимание, самое интересное.
Теперь мы читаем класс из потока, пусть нам извсетно что этот класс -- A. Сначала мы заводим буффер, считываем туда блок памяти, а потом конструируем класс в этом буфере с помощью placement new.

[c++]
char *buf = malloc(sizeof(A));
stream.read(buf, sizeof(A));
new (buf) A();
[/c++]

В результате мы получаем все pod-данные A загруженными, да и структура A тоже восстановлена! По-моему здорово.

Дальше надеюсь додумаете сами.

P.S. Маленькая подсказка: если конструктор класса перезаписывает эти самые pod-члены, то можно определить еще один, пустой:

[c++]
struct some_strange_object {};

struct A {
int var;

A() {
var = 0;
}

A(some_strange_object *p) {
}
};

...

char *buf = malloc(sizeof(A));
stream.read(buf, sizeof(A));
new (buf) A((some_strange_object *) 0);
[/c++]

P.P.S. Ну, а не-POD типы нужно будет грузить вручную, пользуясь другими методиками.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.