2011-11-30 1 views
3

Возможно ли в C++ сериализовать объект, взяв указатель на первый адрес объекта и увеличив этот указатель до конца объекта?Как сериализовать объекты в C++ путем копирования памяти?

Если возможно, как я могу найти первый адрес памяти объекта и в каком типе данных я должен хранить значения? И как я мог построить объект с другой стороны?

+0

Почему вы хотите сериализовать. это отправить объект другому процессу или компьютеру, или вы можете записать его в файл? –

+2

Вот некоторые вещи, которые вам нужно будет рассмотреть: (1) как бороться с классами, которые имеют нетривиальные конструкторы; (2) как обращаться с указателями/ссылками, содержащимися в объекте; (3) как обращаться с виртуальными базовыми классами. – NPE

+0

может быть отправлен через сокет tcp или что-то еще. – user1073834

ответ

3

Это относительно легко сделать в некоторых очень ограничительных обстоятельствах (POD без указателей/ссылок, одинаковой ОС, архитектуры процессора и компилятора C++ на обоих концах канала сериализации).

Существует целый ряд вопросов, которые усложняют вопросы, в более общем случае:

  1. дело с классами, которые имеют нетривиальные конструкторы/деструкторы;
  2. , связанный с указателями/ссылками, содержащимися в объекте;
  3. циклы в указателе/​​контрольном графе;
  4. полиморфизм;
  5. деловые виртуальные базовые классы;
  6. endianness;
  7. выравнивание полей, прокладка и т. Д .;
  8. Ширина примитивных типов (int на одной платформе не обязательно равна размеру int);
  9. версия, позволяющая добавлять новые поля без разрыва.
+3

Даже в POD, не содержащем указателей или ссылок, он может выйти из строя из-за заполнения полей. –

+0

@Jerry: зависит от того, что означает aix, «той же ОС, архитектуры процессора и компилятора C++». Если две реализации имеют C ABI, тогда они обязательно будут иметь одинаковый макет для структур POD. Но параметры компилятора могут повлиять на это. –

+0

@SteveJessop: довольно часто использовать такие вещи, как '#pragma pack', чтобы принудительно установить выравнивание для структур, используемых в ABI, но все еще имеют вариации в других структурах, поэтому совместное использование ABI не обязательно означает многозначительное. –

0

Есть несколько форматов сериализации (XDR, ASN1, JSON, YAML), методы и библиотеки (как s11n для C++)

2

Процедура вы охарактеризовали бы создать плоскую копию объекта. Если бы этот объект содержал указатели или ссылки, эта схема могла бы сломаться.

Если вы хотите сериализовать объекты, используйте библиотеку, такую ​​как Boost.Serialization.

+0

И даже если он не полностью переносится, поскольку он предоставляет детали реализации, такие как выравнивание, заполнение, конец и размеры типов. –

+1

не думал. спасибо – user1073834

Смежные вопросы