Я хочу иметь возможность сериализации 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 сериализировал РУЧКИ как целые?
Спасибо
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);
Закончилось решение проблемы путем разделения сериализации. Похоже, взломать хотя:
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()
};