标签: boost-serialization

便携式存档不在GCC下编译

我需要(在)Windows和Linux上(de)序列化数据(并在其间传输文件).我想使用Boost序列化库的可移植二进制存档,可以在示例中找到,例如参见http://boost-doc-zh.googlecode.com/svn-history/r380/trunk/libs/serialization/example /

这适用于Windows(VS 2008),但无法在GCC 4.3.2下编译,但有以下错误.

有人可以提出解决方案吗?

非常感谢!

/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp: In member function 'void portable_binary_iarchive::init(unsigned int)':
/projects/lib/BOOST/1_44_0/include/boost/archive/basic_archive.hpp:78: error: 'uint_least32_t boost::archive::version_type::t' is private
/home/myfolder/src/portable_binary_iarchive.cpp:92: error: within this context
/home/myfolder/src/portable_binary_iarchive.hpp: In member function 'void portable_binary_iarchive::load(T&) [with T = boost::archive::class_id_type]':
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:107:   instantiated from 'static void boost::archive::load_access::load_primitive(Archive&, T&) [with Archive = portable_binary_iarchive, T = boost::archive::class_id_type]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:356:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::load_primitive::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:433:   instantiated from 'static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = boost::archive::class_id_type, Archive = portable_binary_iarchive]'
/projects/lib/BOOST/1_44_0/include/boost/archive/detail/iserializer.hpp:586:   instantiated …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-serialization

11
推荐指数
1
解决办法
548
查看次数

c ++ 11 std :: shared_ptr + boost :: serialization

嗨有任何人已经设法使用boost :: serialization序列化C++ 11 std :: shared_ptr.有很多过时的帖子,但没有一个可接受的解决方案.我不打算讨论为什么我要使用std :: shared_ptr只是接受它!

我发现了另一篇帖子:boost serialize和std :: shared_ptr但它没有回答我的问题如何序列化std :: shared_ptr它只建议使用boost :: shared_ptr,这在我的情况下是不可能的.

这篇文章如何将boost :: serialization与来自C++ 11的std :: shared_ptr一起使用?也建议只使用boost :: shared_ptr.

如果有人已经找到了解决std :: shared_ptr序列化问题的工作,我会感兴趣.

嘿家伙我终于找到了我的问题的解决方案,请参阅/sf/answers/1049957751/获取我的答案.

c++ shared-ptr boost-serialization

11
推荐指数
1
解决办法
2397
查看次数

提升序列化库升级

我怎么知道我可以安全地升级生产系统上的Boost Serialization Library而不破坏与现有数据的兼容性?是否有任何测试我应该执行以确保新版本的库成功读取以前版本的库以二进制格式存储的所有数据?Boost Serialization库本身是否保证了版本之间的某种兼容性?

c++ boost boost-serialization

10
推荐指数
2
解决办法
1560
查看次数

序列化variables_map

如何序列化/反序列化boost :: program_options :: variables_map?我找不到已经实现的序列化函数,我不知道我可以使用variables_map中的哪些函数来提取和重新组合映射.

c++ boost boost-program-options boost-serialization

10
推荐指数
1
解决办法
1398
查看次数

从boost :: archive :: text_oarchive_impl和boost :: archive :: text_iarchive_impl派生自定义归档类

注意:
Boost的归档方案基于对称的输入和输出归档类.一直写下这两个都很乏味,所以我会用它?archive来表示oarchiveiarchive.

总结:
从改变我的自定义档案的基类后binary_?archive_impltext_?archive_impl,我自定义的存档类不再是"发现"当编译器实例化serialize(...)我在其他类中的方法.

背景:
我的应用程序成功地使用子类binary_?archive_impl(文档和/或代码注释推荐此文件来源)读取和写入文件到磁盘binary_?archive.我需要从二进制文件格式切换到文本格式,因此我将自定义归档的基类切换为text_?archive_impl.一切都爆发了.

问题:
我的自定义归档类添加了功能,包括其Boost基类中不存在的一些其他方法; 这些方法在serialize(...)我的许多类中的方法中调用,并且它们工作正常.更改基类后binary_?archive_impltext_?archive_impl,我收到遍布说我的自定义方法的地方编译错误不存在text_?archive.嗯,这很明显(!!!),但它们确实存在于我的自定义存档中,当我使用Boost的二进制基类时,它们工作得很好.这是怎么回事?

我发现了什么,以及我暂时的 - 但不可取的 - 解决方案:
撕掉我的头发并绕圈走了大约一天后,这就是我发现的......

1)前一段时间(我相信Boost 1.34),文件"binary_?archive.hpp"被分成"binary_?archive_impl.hpp"和"binary_?archive.hpp"(后者#include前者).这不是 "text_?archive.hpp".(结果,我将应用程序的#include行从"binary_?archive_impl.hpp"更改为"text_?archive.hpp".)

2)如果我将"text_?archive.hpp"分成两部分而#include只包含"..._ impl.hpp"标题,那么一切正常.(但我真的希望修改我的升压安装!)

3)仔细观察这些标题并摆弄一下,我发现如果我使用原始的,未经修改的标题并注释掉该行

BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
Run Code Online (Sandbox Code Playgroud)

(同样如此text_iarchive),然后一切正常.(顺便说一下,我在自己的存档代码中有类似的行来"注册"我的自定义存档.)

神秘和我的困境:
A)为什么这些线条的存在会污染作品?...为什么删除它们会让事情发生变化?......这样做我可能会破坏(不知道)吗?

B)为什么"text_?archive.hpp"文件很久以前就没有与"binary_?archive.hpp"文件一起拆分了?(图书馆坏了吗?应该修好吗?)

C)有没有办法在我的应用程序代码中解决这个问题而不修改我的Boost安装?

PS我正在使用Boost 1.48和Visual Studio 2010(64位)
PPS我想以上所有内容同样适用于text_w?archive

c++ serialization boost boost-serialization visual-c++

10
推荐指数
1
解决办法
938
查看次数

提升序列化:指定模板类版本

我有一个我序列化的模板类(称之为C),为此我要为boost序列化指定一个版本.由于BOOST_CLASS_VERSION不适用于模板类.我试过这个:

namespace boost {
namespace serialization {
    template< typename T, typename U >
    struct version< C<T,U> >
    {
        typedef mpl::int_<1> type;
        typedef mpl::integral_c_tag tag;
        BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value);
    };
}
}
Run Code Online (Sandbox Code Playgroud)

但它没有编译.在VC8下,后续调用BOOST_CLASS_VERSION会出现此错误:

error C2913: explicit specialization; 'boost::serialization::version' is not a specialization of a class template

这样做的正确方法是什么?

c++ boost-serialization

9
推荐指数
1
解决办法
4208
查看次数

boost序列化std :: unique_ptr支持

boost序列化库是否支持std :: unique_ptr的序列化?我试着编译下面的代码,但如果我包含 boost :: archive :: text_oarchive oa(ofs); oa << g; 线,

编译器(btw gcc4.7与-std = c ++ 11标志)抛出错误

/usr/include/boost/serialization/access.hpp:118:9:错误:'class std :: unique_ptr'没有名为'serialize'的成员

#include <iostream>
#include <memory>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class MyDegrees
{
public:
  void setDeg(int d){deg = d;}
  int getDeg()const {return deg;}
private:
  friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    { ar & deg; }
  int deg;
};
class gps_position
{
private:
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-serialization c++11

9
推荐指数
5
解决办法
2768
查看次数

提升序列化性能:文本与二进制格式

如果性能有问题,我是否应该优先选择ascii/text序列化的二进制序列化?

有人在大量数据上测试过吗?

c++ boost-serialization

8
推荐指数
2
解决办法
4129
查看次数

提升序列化文件结尾

我使用Boost将多个对象序列化为二进制存档.从a读回那些对象时binary_iarchive,有没有办法知道存档中有多少对象,或者只是一种检测存档结束的方法?

我找到的唯一方法是使用try-catch来检测流异常.提前致谢.

boost eof boost-serialization

8
推荐指数
1
解决办法
1553
查看次数

获取非侵入式boost序列化C++的私有数据成员

我尝试A为我的非成员serialize()函数提供类的getter,因为从成员访问是私有的.

template<typename T>
class A
{
public:
  A(const T& id) : m_id(id) {}
  T& getRef() { return m_id; } // not giving good results
  T  getId()  { return m_id; } // not giving good results
  const T& getRef() const { return m_id; } // not giving good results
private: // I would like to keep it private
  T m_id;
}

namespace boost { namespace serialization {

template<class Archive,typename T>
void serialize(Archive &ar, A &a, const unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ serialization boost boost-serialization

8
推荐指数
1
解决办法
1277
查看次数