标签: boost-serialization

使用boost序列化抽象类时出错

我正在尝试序列化我的数据结构,以便将它们写入tcp套接字.

到目前为止,我发现我的问题是序列化.我甚至试过用

BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)
Run Code Online (Sandbox Code Playgroud)

但我找不到任何与我的程序类似的工作示例以及如何正确实现它.

以下是我访问过的一些链接:

我的数据结构比这个更复杂,但我们假设我有以下结构

Coordinate.h

#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>

class Coordinate {
public:
    Coordinate() {}
    Coordinate(int c) : c(c) {}
    int get(void) { return c; }
    std::string toString(void);
private:
    int c;
    friend class boost::serialization::access;
    template<typename Archive>
    void serialize(Archive &ar, const unsigned int version) {
        ar & this->c;
    }
};
Run Code Online (Sandbox Code Playgroud)

Move.h

class Coordinate;

#include "Coordinate.h"

#include <boost\archive\text_iarchive.hpp>
#include <boost\archive\text_oarchive.hpp>

class Move {
public:
    Move() {}
    ~Move() {}
    Coordinate* getCoordinate(void) {return this->destination; }
    virtual bool isJump(void) = …
Run Code Online (Sandbox Code Playgroud)

c++ abstract-class visual-studio-2010 boost-serialization

5
推荐指数
1
解决办法
3750
查看次数

通过自定义函数序列化union类型:"static assertion failed :: typex :: value"

我正在cl_long2从OpenCL 序列化类型,这个类型定义如下(简化自/usr/include/CL/cl_platform.hpp):

typedef int64_t cl_long;
typedef union
{
    cl_long __attribute__ ((aligned(16))) s[2];
    struct{ cl_long  x, y; };
    struct{ cl_long  s0, s1; };
    struct{ cl_long  lo, hi; };
} cl_long2;
Run Code Online (Sandbox Code Playgroud)

我定义了以下独立序列化函数:

namespace boost{ namespace serialization {
template<class Archive> void serialize(Archive &ar, cl_long2 &i, const unsigned version){
   ar & make_nvp("x",i.x);
   ar & make_nvp("y",i.y);
}

}};
Run Code Online (Sandbox Code Playgroud)

当我编译我的代码,它从类成员调用cl_long2的序列化时,我得到以下错误,我无法理解(错误是相同的,如果它不是一个std::vector<cl_long2>,只是一个独立的变量):

/usr/include/boost/archive/detail/check.hpp: In function ‘void boost::archive::detail::check_object_level() [with T = cl_long2]’:
/usr/include/boost/archive/detail/iserializer.hpp:438:9:   instantiated from ‘static void boost::archive::detail::load_non_pointer_type<Archive>::invoke(Archive&, T&) [with T = cl_long2, …
Run Code Online (Sandbox Code Playgroud)

opencl boost-serialization

4
推荐指数
1
解决办法
1689
查看次数

使用带有STL容器的boost.serialization作为模板参数

我想将boost.serialization与模板化容器类一起使用:

// MyContainer.h

template<class T> struct MyContainer {
    T t;

    template<class Archive>
    void serialize(Archive& archive, const unsigned version) {
        archive & t;
    }
};
Run Code Online (Sandbox Code Playgroud)

当我使用STL容器作为模板参数时,例如

// Main.cpp
...
MyContainer<array<int,4>> mc;
std::ofstream ofs("foo.bar");
boost::archive::binary_oarchive oa(ofs);
oa << mc;
...
Run Code Online (Sandbox Code Playgroud)

... Visual Studio 11抱怨以下错误消息:

'serialize' : is not a member of 'std::array<_Ty,_Size>'
Run Code Online (Sandbox Code Playgroud)

我试图在两个文件中包含"boost/serialization/array.hpp",但这并没有解决问题.此外,包括数组专门化不是我想要的,因为容器也可以容纳任何其他STL容器.

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

c++ stl boost-serialization

4
推荐指数
1
解决办法
1442
查看次数

如何使用Boost:序列化来保存Eigen :: Matrix

您好我有一个代码实现libeigen2来计算特征向量.现在我想使用boost :: serialization来保存稍后检索的信息.从示例教程中我得出以下代码!

class RandomNode {
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
   ar & is_leaf_;
   ar & depth_;
   ar & num_classes_;
   ar & num_features_;
   // Split node members
   ar & random_feature_indices_;
   ar & random_feature_weights_;
   ar & threshold_;
   ar & leftChild_;
   ar & rightChild_;

 }
bool is_leaf_;
int depth_;
int num_classes_;
int num_features_;

// Split node members
VectorXi random_feature_indices_;
VectorXd random_feature_weights_;
double threshold_;
RandomNode* leftChild_;
RandomNode* rightChild_;
 // Methods and …
Run Code Online (Sandbox Code Playgroud)

boost-serialization eigen

4
推荐指数
1
解决办法
2389
查看次数

提升std unique_ptrs的stl集合的序列化

我希望能够序列化std :: unique_ptrs的stl容器.可以吗?顺便说一下,单个std :: unique_ptr一切正常.下面是我正在处理的代码,gcc给出了以下错误:

 use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const
 std::unique_ptr<_Tp, _Dp>&) [with _Tp = MyDegrees; _Dp =
 std::default_delete<MyDegrees>; std::unique_ptr<_Tp, _Dp> =
 std::unique_ptr<MyDegrees>]’
Run Code Online (Sandbox Code Playgroud)

如何使代码工作?

#include <iostream>
#include <memory>
#include <fstream>
#include <map>
#include <vector>
#include <boost/serialization/map.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
namespace boost {
namespace serialization {

template<class Archive, class T>
inline void save(
    Archive & ar,
    const std::unique_ptr< T > &t,
    const unsigned int file_version
) {
    // only the raw pointer has …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-serialization c++11

4
推荐指数
1
解决办法
1813
查看次数

如何让boost :: serialization工作?

我正在研究ubuntu 12.04LTS并使用clang 3.4.

我有一个CMake项目,想要使用boost序列化库.我从SourceForge下载了boost 1.55.0.

我的项目文件夹树看起来像:

MyProject
    |    Source
    |       |    main.cpp
    |       |    CMakeLists.txt
    |    Build
    |    Libraries
    |       |    Boost1p55p0
    |       |         |    boost
    |       |         |    ...other boost data
    |       |         |    build
    |       |         |       |    include
    |       |         |       |    lib
Run Code Online (Sandbox Code Playgroud)

所以在Boost1p55p0目录中我创建了一个新目录build,因此bootstrap看起来像:

./bootstrap.sh --prefix=build/
Run Code Online (Sandbox Code Playgroud)

然后我做了

./b2
Run Code Online (Sandbox Code Playgroud)

./b2 install
Run Code Online (Sandbox Code Playgroud)

所以最小的不工作的例子是:

的CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)

set( CMAKE_C_COMPILER clang )
set( CMAKE_CXX_COMPILER clang++ )
set( CMAKE_LINKER llvm-link )

project (Test)
include_directories( ${PROJECT_SOURCE_DIR} ../Libraries/Boost1p55p0/build/include …
Run Code Online (Sandbox Code Playgroud)

c++ boost cmake boost-serialization ubuntu-12.04

4
推荐指数
1
解决办法
1414
查看次数

提升多边形序列化:环

根据这个相关问题(Boost Polygon Serialization).我试图用Boost序列化多边形.我现在的问题是我正在尝试使用自定义X,Y,点的多边形编译示例,但编译器在编译时抛出此错误:

error: 'class boost::geometry::model::ring<boost::geometry::model::d2::point_xy<double> >' has no member named 'serialize'
Run Code Online (Sandbox Code Playgroud)

就像没有定义任何序列化环的功能一样.由于环从std :: vector扩展,并且如相关问题中所述,因此没有必要为其序列化定义方法.但是编译器抱怨道.

这里我有一个关于定义多边形及其序列化的完整示例:

#include <fstream>

#include <boost/serialization/vector.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/tracking.hpp>

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/io/wkt/wkt.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/geometry/geometries/ring.hpp>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

typedef boost::geometry::model::d2::point_xy< double > point;
typedef boost::geometry::model::ring< point > ring;
typedef boost::geometry::model::polygon< point > polygon;

namespace boost{
        namespace serialization{

                template<class Archive>
                inline void serialize(Archive & ar, point &point, const unsigned int file_version)
                {
                        std::cout << "Point: …
Run Code Online (Sandbox Code Playgroud)

c++ serialization boost boost-serialization boost-geometry

4
推荐指数
1
解决办法
1103
查看次数

boost::serialization:具有私有默认构造函数的对象在向量中工作,但在映射中不起作用

考虑以下代码:

#include <boost/serialization/nvp.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>

class Foo{
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int)
    {
        ar & BOOST_SERIALIZATION_NVP(i);
    }
    int i;
    Foo():i(0){}
public:
    Foo(int k):i(k){}
};

int main(int argc, char *argv[])
{
    std::vector< Foo> f;
    f.push_back(Foo(12));
    std::ofstream os("path");
    boost::archive::xml_oarchive oa(os);
    oa << boost::serialization::make_nvp("f", f);
    os.close();
    std::vector<Foo> g;
    std::ifstream is("path");
    boost::archive::xml_iarchive ia(is);
    ia >> boost::serialization::make_nvp("f", g);
}
Run Code Online (Sandbox Code Playgroud)

在序列化 Foos 向量时效果很好。但是,如果我尝试序列化 Foos 的映射,它会在私有默认构造函数上失败:

std::map<std::string, Foo> f;
f.insert(std::make_pair("hello", Foo(12)));
std::ofstream os("path");
boost::archive::xml_oarchive oa(os);
oa << boost::serialization::make_nvp("f", …
Run Code Online (Sandbox Code Playgroud)

c++ boost stdmap boost-serialization

4
推荐指数
1
解决办法
1827
查看次数

使用 boost 反序列化二进制数据时,static_assert 失败了“typex::value”失败

下面的代码序列化和反序列化类和结构的成员。序列化正在工作,但我在尝试使用反序列化它时遇到了以下错误oarch >> BOOST_SERIALIZATION_NVP(outObj); 代码中是否有任何我尚未实现和未实现的大遗漏。

在 main.cpp 包含的文件中:1:在 /usr/local/include/boost/archive/binary_oarchive.hpp 中包含的文件中:21:在 /usr/local/include/boost/archive/binary_oarchive_impl.hpp 中包含的文件中: 22:在 /usr/local/include/boost/archive/basic_binary_oarchive.hpp 包含的文件中:33:在 /usr/local/include/boost/archive/detail/common_oarchive.hpp 中包含的文件中:22:在文件中包含/usr/local/include/boost/archive/detail/interface_oarchive.hpp:23:在 /usr/local/include/boost/archive/detail/oserializer.hpp 包含的文件中:68:/usr/local/include/boost /archive/detail/check.hpp:162:5: 错误:static_assert 失败 "typex::value" BOOST_STATIC_ASSERT(typex::value); ^ ~~~~~~~~~~~~ /usr/local/include/boost/static_assert.hpp:70:41: 注意:扩展自宏“BOOST_STATIC_ASSERT”

#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/nvp.hpp>
#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <fstream>

#include <map>
#include <boost/serialization/map.hpp>
#include <boost/serialization/split_member.hpp>

struct values
{
    std::string name;
    std::string sex;
    values():name("dummy"),sex("dummy"){} ;

    template<class Archive>   
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & BOOST_SERIALIZATION_NVP(name);
        ar …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-serialization

4
推荐指数
1
解决办法
1116
查看次数

Boost序列化多态寄存器(导出)不能跨文件工作

boost::serialization在我的项目中使用.该项目很大,并在几个地方序列化我的对象.根据这里文档,我应该用两个单独的步骤导出我的类.

  1. BOOST_EXPORT_KEY().h文件中,女巫包含声明.
  2. BOOST_EXPOET_IMPLEMENT().cpp文件中,witch包含导出的实例化(定义).

hier.h 在类层次结构中,层次结构中有3个类.

/*
B <---+--- D1
      |
      +--- D2
*/

#include <boost/serialization/base_object.hpp>                                                                                                                                                                 

class B {                                                                                                                                                                                                      
public:                                                                                                                                                                                                        
    virtual ~B() {}                                                                                                                                                                                            
    template < typename Ar >                                                                                                                                                                                   
    void serialize(Ar& ar, const int) {                                                                                                                                                                        
    }                                                                                                                                                                                                          
} ;                                                                                                                                                                                                            

class D1 : public B {                                                                                                                                                                                          
public:                                                                                                                                                                                                        
    virtual ~D1() {}                                                                                                                                                                                           
    template < typename Ar > void serialize(Ar& ar, const int) {                                                                                                                                               
        boost::serialization::base_object<B>(*this);                                                                                                                                                           
    }                                                                                                                                                                                                          
} ;                                                                                                                                                                                                            

class D2 : public B {                                                                                                                                                                                          
public: …
Run Code Online (Sandbox Code Playgroud)

boost boost-serialization

3
推荐指数
1
解决办法
4008
查看次数