我需要编写一个linux c ++应用程序,它以XML格式保存设置(便于手动编辑),并通过套接字和HTTP上的XML消息与现有应用程序通信.问题是我找不到任何智能库来帮助我,我并不特别喜欢编写DOM或SAX代码来编写和阅读一些非常简单的消息.
Boost Serialization几乎是匹配,但它为它生成的xml添加了许多特定于boost的数据.这显然不适用于交换格式.我想知道是否有可能使Boost Serialization或其他一些c ++序列化库生成干净的xml.我不介意是否有一些必需的额外属性 - 比如版本属性,但我真的希望能够控制他们的命名并摆脱我不使用的'功能' - tracking_level和class_id for实例.
理想情况下,我只想在Java中使用类似于xstream的东西.我知道c ++缺乏内省,因此有必要进行一些手动编码 - 但是如果有一个干净的解决方案来读取和编写简单的XML而没有kludges会很好!
如果无法做到这一点,我也对XML模式是规范资源(合同优先)的工具感兴趣 - 一个很好的JAXB替代C++.到目前为止,我只找到了像CodeSynthesis XSD这样的商业解决方案.我更喜欢开源解决方案.我尝试过gSoap - 但是它生成了非常丑陋的代码,并且它也是特定于SOAP的.
无奈之下,我也开始研究protobuffers的替代序列化格式.这存在 - 但仅限Java!令我惊讶的是,协议缓冲区似乎是比XML更好的支持数据交换格式.
我很生气只为这个应用程序找到libs,我真的需要一些新的想法.任何人?
c++ xstream xml-serialization codesynthesis boost-serialization
我实际上是尝试使用boost :: serialize序列化boost :: function,因为我想在boost :: interprocess :: message_queue中共享它.我只看到一种方法,它是使用非侵入式版本的boost :: serialize.
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, boost::function<void()> & fct, const unsigned int version)
{
ar & fct.args;
ar & fct.arity;
ar & fct.vtable;
ar & fct.functor;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还需要序列化vtable和functor,我没有尝试过,我不确定它是否正常工作.
那么有没有办法以正确的方式序列化boost :: function?
谢谢.
c++ boost boost-serialization boost-interprocess boost-function
我在C++中遇到问题,在调用派生类的函数的同时有一个指向基类的指针.
编辑:一些答案提到我CRTP
但我的观点是我需要一个指向"Base*"类而不是"Base*"的指针,因为我不知道当前正在处理的类型(当前实例是从某种工厂创建的).
class Base
{
..
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
class Derived1 : public Base
{
...
template<typename T>
func (T arg) { ... };
};
Run Code Online (Sandbox Code Playgroud)
int main()
{
Base* BasePtr = new Derived1();
// The expected function to be called is Derived1::func<int>()
BasePtr->func<int>();
return 0; // :)
}
Run Code Online (Sandbox Code Playgroud)
我不能使func虚拟,因为该语言不支持虚拟模板功能.
仅当类只有模板参数时才允许,但如果其中的函数具有模板参数则不允许.
我已经看到在Boost.Serialization中解决了类似的问题,但无法理解解决方案.
谢谢,
Koby Meir
我在我的应用程序中使用相当复杂的数据结构(主要使用STL容器),并使用Boost(v1.34)对它们进行序列化.
每当我使用调试符号(gcc -g)进行编译时,生成的可执行文件都会变得很大 - 大约25 MB.剥离所有调试符号可将大小减小到约3 MB.
我试图确定大小增加的原因,似乎序列化方法是原因.特别是,调用序列化的模块的目标文件(像"oarchive << myObject"这样的代码)很大,并且注释掉序列化部分会显着减小尺寸.
是否有可能阻止这些符号的产生,或者有选择地剥离它们?
剥离所有符号不是一种选择,因为我需要为自己的代码调试符号.
我有一个使用Boost.Serialization的C++库.我正在使用Boost.Python为这个库创建Python绑定.很明显如何为Boost.Python创建一个使用Boost.Serialization的pickle套件(使用Boost.Serialization保存到一个字符串,并将该字符串返回给Python).
我想要的是相反的:给定a boost::python::object,我想要一个serialize(...)函数来调用Python的pickle.dumps()函数并序列化结果字符串.(想象一下std::vector<boost::python::object>.当我序列化这个向量时,Boost.Serialization会调用辅助serialize()函数.)这可能吗?更好的是,是否可以使用cPickle和绕过将控件提供给Python解释器?
我正在尝试为移动设备的网络视频游戏设置多用途序列化.因为它是联网的,所以在初始连接期间我需要为游戏状态序列化所有数据,但是,一旦游戏正在进行中,我只需要序列化某些更改.作为boost序列化库一部分的save和load方法仅具有版本号作为参数.我希望能够做的是有更多的参数,这样我可以改变什么得到保存和加载基于不仅仅是一个版本号的详细条件.
这是普通的boost序列化save方法目前的样子:
template<class Archive>
void save(Archive& ar, const unsigned int version) const
{
// Serialize stuff here
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要完成的事情:
template<class Archive>
void save(Archive& ar, const unsigned int version, const unsigned int state_flags) const
{
if (state_flags & INITIAL_SERIALIZATION)
{
// Serialize only data needed for an initial serialization
}
// Other serialization
}
Run Code Online (Sandbox Code Playgroud)
我怀疑我可以让boost库调用我想要的序列化方法,因为它重载了运算符,在上面的第一个例子中调用了一个具有特定签名的运算符.我想象在第一个例子中显示save的调用中调用我自己的版本save,并且可能state_flags从一个单独的位置抓取.有没有人对如何干净利落或任何好的替代方案有任何想法?
编辑:我遇到了另一个问题.我需要序列化不一定是类成员的对象,但是文档没有提到对此的任何支持.
这是一个简单的例子:
class Foo
{
private:
SomeClass m_object;
template<class Archive>
void save(Archive& ar, const unsigned int version) …Run Code Online (Sandbox Code Playgroud) 我正在尝试序列化和反序列化原始C指针及其数据,下面的示例.它似乎序列化很好,但我不确定如何使其反序列化 - 当我反序列化时它只是因内存访问冲突异常而崩溃.我想这是因为它不知道如何反序列化它,但我在哪里指定它?
使用矢量不是一种选择,在非常大的原始数据量中它很慢
#include <stdint.h>
#include <string>
#include <iostream>
#include <fstream>
#pragma warning (push)
#pragma warning( disable : 4244 )
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/array.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#pragma warning (pop)
struct Monkey
{
uint32_t num;
float* arr;
};
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, Monkey& m, const unsigned int version)
{
ar & m.num;
ar & make_array<float>(m.arr, m.num);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
const …Run Code Online (Sandbox Code Playgroud) 编译Boost序列化的简单测试时:
class Test
{
protected:
int Num;
friend class boost::serialization::access;
template <class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(Num);
}
public:
Test(): Num(0) {}
~Test() {}
};
Run Code Online (Sandbox Code Playgroud)
使用xml_oarchive输出,我遇到以下GCC错误:
C:\Development\Libraries\boost_1_55_0\boost\mpl\assert.hpp|289|error: no matching function for call to 'assertion_failed(mpl_::failed************ boost::serialization::is_wrapper<Test>::************)'|
Run Code Online (Sandbox Code Playgroud)
使用其他oarchive类型时,它编译并运行正常.我所做的所有研究都指出我使用BOOST_SERIALIZATION_NVP宏来解决错误,但我已经这样做了,我仍然得到这个错误.
有没有人遇到过同样的问题?
我需要对用c ++编写的库进行性能测试.该库由几组结构组成.我已经完成了这些类的序列化测试,但不知道如何对这些进行性能测试.下面是库中结构的示例
struct X
{
public:
int p;
double q;
X();
~X();
}
struct Y
{
float m;
double n;
Y();
~Y();
}
struct Z
{
public:
std::map<std::string,boost::shared_ptr<X>> Xtype;
std::map<std::string,boost::shared_ptr<Y>> Ytype;
int i;
string name;
Z();
~Z();
}
Run Code Online (Sandbox Code Playgroud)
如果提供任何示例,那将非常好.
c++ serialization boost performance-testing boost-serialization
下面是使用很棒的Boost.Serialization库的最小示例。
要编译该库,我需要链接到boost_serialization预编译的库。
$ c++ -std=c++11 example.cpp -o example.x -lboost_serialization
^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
该库经过大量模板化,尽管内部很复杂,但实际代码(函数体)非常简单。只有少数参考文献需要链接,即:
boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::ostream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::text_iarchive_impl(std::istream&, unsigned int)
boost::archive::text_iarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()
boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::~text_iarchive_impl()
...
boost::archive::archive_exception::~archive_exception()'
Run Code Online (Sandbox Code Playgroud)
是否有可能在不链接为仅标头库的情况下使用该库?
例如一些未记录的技巧或黑客行为?
这将使其在某些超级计算机集群和环境中使用起来更加简单,而在这些环境中,编译 Boost 并不是那么简单。
#include<sstream>
#include<numeric>
#include<boost/archive/text_oarchive.hpp> // needs linking
#include<boost/archive/text_iarchive.hpp>
#include<boost/serialization/vector.hpp>
int main(){
std::vector<double> v(10); std::iota(v.begin(), v.end(), 0);
std::stringstream ss;
{
boost::archive::text_oarchive toa(ss);
toa << v;
}
std::vector<double> v2;
boost::archive::text_iarchive tia(ss);
tia >> v2;
assert(v == v2);
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果库提供仅标头的选项,就像 Boost.Asio 那样(/sf/answers/2851060761/。)
EDIT2:Boost.Serialization 的作者和维护者拒绝了仅将其设为标头的想法。https://github.com/boostorg/serialization/issues/71