我有一个复杂的对象网络连接QSharedPointers和QWeakPointers.有没有一种简单的方法来使用Boost.Serialization保存/加载它们?到目前为止我有这个:
namespace boost {
namespace serialization {
template<class Archive, class T>
void save(Archive& ar, QSharedPointer<T> const& ptr, unsigned version) {
T* sharedPointer = ptr.data();
ar & BOOST_SERIALIZATION_NVP(sharedPointer);
}
template<class Archive, class T>
void load(Archive& ar, QSharedPointer<T>& ptr, unsigned version) {
T* sharedPointer = 0;
ar & BOOST_SERIALIZATION_NVP(sharedPointer);
ptr = QSharedPointer<T>(sharedPointer);
}
template<class Archive, class T>
void save(Archive& ar, QWeakPointer<T> const& ptr, unsigned version) {
T* weakPointer = ptr.toStrongRef().data();
ar & BOOST_SERIALIZATION_NVP(weakPointer);
}
template<class Archive, class T>
void load(Archive& ar, QWeakPointer<T>& …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个C++项目,我想使用boost的序列化库.我从boost的主页下载并安装了最新的boost库.
当我尝试编译并运行boost的演示序列化示例时,我得到了各种各样的错误,如下所示:
/usr/local/include/boost/archive/detail/iserializer.hpp:173: undefined reference to `boost::archive::archive_exception::~archive_exception()'
./demo.o: In function `void boost::archive::detail::save_non_pointer_type<boost::archive::text_oarchive>::save_standard::invoke<bus_schedule::trip_info>(boost::archive::text_oarchive&, bus_schedule::trip_info const&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:253: undefined reference to `boost::archive::detail::basic_oarchive::save_object(void const*, boost::archive::detail::basic_oserializer const&)'
./demo.o: In function `void boost::archive::save_access::end_preamble<boost::archive::text_oarchive>(boost::archive::text_oarchive&)':
/usr/local/include/boost/archive/detail/oserializer.hpp:83: undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'
./demo.o: In function `void boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::invoke<bus_route*>(boost::archive::text_iarchive&, bus_route*&)':
/usr/local/include/boost/archive/detail/iserializer.hpp:518: undefined reference to `boost::archive::detail::basic_iarchive::load_pointer(void*&, boost::archive::detail::basic_pointer_iserializer const*, boost::archive::detail::basic_pointer_iserializer const* (*)(boost::serialization::extended_type_info const&))'
./demo.o: In function `void boost::archive::detail::save_pointer_type<boost::archive::text_oarchive>::non_polymorphic::save<bus_route>(boost::archive::text_oarchive&, bus_route&)':
Run Code Online (Sandbox Code Playgroud)
我是C++的新手并且提升所以任何帮助都会受到赞赏.
谢谢
在我们的应用程序中,我们使用std::map
存储(键,值)数据并使用序列化将该数据存储在磁盘上.通过这种方法,我们发现磁盘I/O是性能瓶颈,使用密钥查找值不是很快.
我遇到了LevelDB并且正在考虑使用它.但我有一些问题.
std::map
和LevelDB 之间的区别在于LevelDB是持久的并且std::map
在内存中工作.这是否意味着磁盘I/O瓶颈对于levelDB来说会更成问题.更具体地说,任何人都可以解释一下LevelDB是否可能是更好的选择std::map
?
PS:我尝试使用hash_map
s但它看起来比较慢std::map
我正在尝试使用boost 1-49的序列化库来编译一个Android应用程序.具体来说,这个项目有一些方便的脚本来完成工作:https://github.com/MysticTreeGames/Boost-for-Android
使用gnu-libstdc ++ 4.6为armeabi-v7a构建没有针对官方ndk-r8的问题.
至少,它能够创建libboost_serialization-gcc-mt-1_49.a而不会遇到任何错误.在构建期间抛出了几个警告,'禁止零大小数组'_pad'[-pedantic]','不支持'long long','不允许命名的变量宏',没有什么看起来很严重,但我不知道声称自己是gnu编译器的专家.
构建boost也创建了libboost_wserialization-gcc-mt-1_49.a,这似乎很奇怪,但可能无关紧要.我没有将它包含在我的makefile中.
无论如何,当我现在尝试使用此库编译我的代码时,我收到以下错误:
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::xml_iarchive>::load(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&):./boost/archive/impl/xml_iarchive_impl.ipp:71: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::xml_iarchive>::load(wchar_t*):./boost/archive/impl/xml_iarchive_impl.ipp:101: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::naked_xml_iarchive>::load(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&):./boost/archive/impl/xml_iarchive_impl.ipp:71: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_iarchive.o): in function boost::archive::xml_iarchive_impl<boost::archive::naked_xml_iarchive>::load(wchar_t*):./boost/archive/impl/xml_iarchive_impl.ipp:101: error: undefined reference to 'mbtowc'
/Users/wespaugh/Development/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/libboost_serialization-gcc-mt-1_49.a(xml_oarchive.o): in function boost::archive::iterators::ostream_iterator<char> std::__copy_move<false, false, std::input_iterator_tag>::__copy_m<boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::ostream_iterator<char> >(boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::mb_from_wchar<boost::archive::iterators::xml_escape<wchar_t const*> >, boost::archive::iterators::ostream_iterator<char>):./boost/archive/iterators/mb_from_wchar.hpp:91: error: undefined reference to …
Run Code Online (Sandbox Code Playgroud) 似乎boost序列化无法从基于文本的归档中恢复值Nan和inf.
除非你archive_exception
在这种情况下处理任何解决方案,否则程序将终止?
我试图编写一个使用boost :: serialize的函数,如果一个对象可以被序列化,如果该对象不能用boost :: serialize编写,则使用回退.是否有一些基于模板的方法来测试给定的类是否可以序列化?
// ideally, something of this form
is_boost_serializeable<T>::value
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用SFINAE来检查单个方法的存在,但是如何提供序列化的许多不同选项,我担心我会错过一些边缘情况.事实上,我还没有在boost文档中找到任何描述已经存在的这样一个函数的东西.
我正在开发一个分布式应用程序,它有两个组件.一个用标准C++编写(不是托管C++,在Linux平台上运行),另一个用C#编写.两者都通过消息总线进行通信.
我有一种情况需要将对象从C++传递到C#应用程序,为此我需要在C++中序列化这些对象并在C#中对它们进行反序列化(类似于.NET中的编组/解组).我需要以二进制而不是XML(由于性能原因)执行此序列化.
我曾经习惯Boost.Serialization
这样做,当两端都是用C++实现的,但现在我的一端有一个.NET应用程序,Boost.Serialization
这不是一个可行的解决方案.
我正在寻找一种解决方案,允许我跨C++和.NET边界执行(反)序列化,即跨平台二进制序列化.
我知道我可以在C++ DLL中实现(de)序列化代码并P/Invoke
在.NET应用程序中使用,但我想保留它作为最后的手段.
另外,我想知道我是否使用像gzip这样的标准,这会有效吗?除了gzip还有其他选择吗?它们的优点/缺点是什么?
谢谢
我正在寻找一种将c ++数据包序列化到网络流的解决方案.
我在这里看到很多帖子引用人们:
高手
Google协议缓冲区
升压::序列化
Qt :: QDataStream
我的要求/限制:
解决方案必须是不知道LitteEndian/BigEndian.机器架构x86/x64和平台无关.
前3个解决方案的占地面积(RAM和ROM)对我的平台来说太大了,第四个解决方案与下一个要求相冲突.
该解决方案不需要大量的样板代码(将有200多个数据包被序列化).
谢谢,Koby Meir
我正在尝试序列化Eigen的矩阵.这样我就可以序列化一个更复杂的对象.我使用Matrix作为基类,并在派生类中包含序列化.我很困惑如何处理Matrix.data(),它返回一个c风格的数组(如果我是正确的).这是我的尝试:
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
template < class TEigenMatrix>
class VariableType : public TEigenMatrix {
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & this.data();
}
public:
};
Run Code Online (Sandbox Code Playgroud)
我想用它作为"包装器":
VariableType<Matrix<double,3,1>> serializableVector;
Run Code Online (Sandbox Code Playgroud)
代替
Matrix<double,3,1> vector;
Run Code Online (Sandbox Code Playgroud) 这是我之前在Boost的另一个线程中打开的一个后续问题:反序列化通过ZeroMQ pull socket传递的自定义C++对象.该线程中的问题已根据提供的答案得到解决.现在我在运行时遇到了另一个问题.请参阅以下说明.我是C++领域的新手,所以如果你告诉我除了我在问题陈述下所描述的代码之外提供的代码的任何部分,我还要感谢.
描述:
我有一个名为GenericMessage的C++类,它只包含一个id和data作为其成员(参见下面的代码片段2 - GenericMessage.hxx).我的目的是序列化这个类的一个实例,并通过一个实现推送模式的ZeroMQ套接字发送它.
序列化和发送任务已在ZMQHandler类中实现(请参阅sendToBE函数),该函数放在头文件名ZMQHandler.hxx中,如下面的代码片段3所示.此类由TestFE.cxx实例化,如下面的第4个代码片段所示.
GenericMessage实例的接收和反序列化在TestBE.cxx 中实现,可在下面的第5个代码片段中找到.我的目的是通过ZMQ套接字(即拉套接字)接收GenericMessage实例,对其进行反序列化,然后将其成员打印到标准输出.
我验证了通过ZeroMQ套接字传输的seriazalition和GenericMessage对象可以正常工作.反序列化似乎也起作用,因为我没有得到任何异常或分段错误之类的东西.
问题陈述:
TestBE.cxx中的代码(参见代码片段5)所期望的是通过ZeroMQ套接字接收GenericMessage对象反序列化它,然后打印它的两个成员,即id和数据,在这种情况下是一个字符串对象.更确切地说,它应首先打印它获取的char流的内容,然后打印反序列化对象的成员.相反,它根本不打印这些成员.Al,它将包括问号在内的奇怪符号放入收到的char流中.请参阅下面的第一个代码段,你会看到我的观点.
问题:
i)为什么我不能得到预期的输出?为什么我在输出中看到标记为奇怪符号的问题?为什么我看不到打印的id和数据字段,尽管它们在打印的字符流中可见?
ii) GenericMessage类中的数据字段是一种模板类型,为了测试目的,它被设置为std :: string.但是,在实际使用中,我计划以序列化形式传输更复杂的对象.在这方面,你认为使用类boost :: archive :: text_iarchive和boost :: archive :: text_oarchive是有用的.我应该使用二进制代码吗?如果是这样,你认为我应该注意一些陷阱/可能存在的问题吗?提前致谢.
SNIPPET 1:程序输出与预期输出
*******************
The EXPECTED OUTPUT
*******************
Connecting to FE...
CHAR [22 serialization::archive 9 0 1 0
0 1 12 Hello there!]
ID: 1
Data: Hello there!
CHAR [22 serialization::archive 9 0 1 …
Run Code Online (Sandbox Code Playgroud)