повысить сериализацию непрозрачных типов

Я хочу иметь возможность сериализации Windows РУЧКА:

typedef void *HANDLE

Если я пытаюсь скомпилировать, используя следующее:

struct Foo
{
HANDLE file;

protected:
friend class boost::serialization::access;

template<class Archive>
void serialize(Archive & ar, const unsigned int /*version*/)
{
ar & file;
}
};

Я получаю ошибки компиляции:

c:\projects\3rdparty\src\boost\include\boost/mpl/print.hpp(51) : warning C4308: negative integral constant converted to unsigned type
c:\projects\3rdparty\src\boost\include\boost/serialization/static_warning.hpp(92) : see reference to class template instantiation 'boost::mpl::print<T>' being compiled
with
[
T=boost::serialization::BOOST_SERIALIZATION_STATIC_WARNING_LINE<98>
]
c:\projects\3rdparty\src\boost\include\boost/archive/detail/check.hpp(98) : see reference to class template instantiation 'boost::serialization::static_warning_test<B,L>' being compiled
with
[
B=false,
L=98
]
c:\projects\3rdparty\src\boost\include\boost/archive/detail/oserializer.hpp(313) : see reference to
function template instantiation 'void boost::archive::detail::check_object_tracking<T>(void)' being compiled
with
[
T=Foo
]
c:\projects\3rdparty\src\boost\include\boost/archive/detail/oserializer.hpp(525) : see reference to
function template instantiation 'void boost::archive::detail::save_non_pointer_type<Archive>::invoke<T>(Archive &,T &)' being compiled
with
[
Archive=boost::archive::text_oarchive,
T=Foo
]

Но если я изменю file для int, Все отлично.
Как мне сказать, чтобы boost сериализировал РУЧКИ как целые?

Спасибо

1

Решение

HANDLE тип данных Windows-API, определенный в winnt.h, Согласно MSDN,

Дескриптор объекта.
Этот тип объявлен в WinNT.h следующее:

typedef PVOID HANDLE;

Итак, теперь мы видим, что HANDLE действительно просто void * — представление дескриптора объекта. Подумайте о том, что вы пытаетесь сделать; имеет ли смысл сериализовать указатель к какому-либо объекту в Windows API?

Вместо этого, попробуйте сериализовать то, что нужно, чтобы получить эквивалент HANDLE; судя по названию члена, думаю, вы использовали CreateFile — Итак, вам нужно знать …

  • Имя файла
  • Желаемый доступ (например, GENERIC_READ | GENERIC_WRITE)
  • Режим обмена (например, FILE_SHARE_DELETE)
  • Опционально, атрибуты безопасности
  • Расположение творения (т.е. CREATE_NEW, TRUNCATE_EXISTING, так далее.)
  • Флаги и атрибуты файла или устройства
  • Опционально файл шаблона — для копирования его атрибутов при создании файла

Теперь, если вы действительно не хочешь этим заниматься — ты положительный Вы хотите значение указателя — возможно, попробуйте сериализовать его после приведения через reinterpret_cast в std::intptr_t или же std::uintptr_t (как может быть быть определенным в cstdint по состоянию на C ++ 11).

ar & reinterpret_cast<std::intptr_t>(file);

… тогда вы должны связать это с чем-то следующим (при десериализации):

std::intptr_t _file;
ar & _file;
HANDLE file = std::reinterpret_cast<HANDLE>(_file);
4

Другие решения

Закончилось решение проблемы путем разделения сериализации. Похоже, взломать хотя:

struct Foo
{
HANDLE file;

protected:
friend class boost::serialization::access;

template<class Archive>
void save(Archive & ar, const unsigned int /*version*/) const
{
unsigned int _file = reinterpret_cast<unsigned int>(file);
ar & _file;
}

template<class Archive>
void load(Archive & ar, const unsigned int /*version*/)
{
unsigned int _file;
ar & _file;
file = reinterpret_cast<HANDLE>(_file);
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
};
0