我正在尝试序列化我的数据结构,以便将它们写入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) 我正在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) 我想将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容器.
这样做的正确方法是什么?
您好我有一个代码实现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) 我希望能够序列化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) 我正在研究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) 根据这个相关问题(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) 考虑以下代码:
#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) 下面的代码序列化和反序列化类和结构的成员。序列化正在工作,但我在尝试使用反序列化它时遇到了以下错误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) 我boost::serialization在我的项目中使用.该项目很大,并在几个地方序列化我的对象.根据这里的文档,我应该用两个单独的步骤导出我的类.
BOOST_EXPORT_KEY()在.h文件中,女巫包含声明.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)