【发布时间】:2016-03-21 14:46:24
【问题描述】:
是否可以使用polymorphic_binary_iarchive 反序列化使用binary_oarchive 序列化的对象?
我的库是使用二进制存档编写的,用于所有序列化方法(以及 EOS 可移植存档)。这导致到处都是重载的serialize 方法、显着的代码膨胀和链接时间成本。我想切换到多态存档方法,以减少暴露的serialize 方法的数量并促进其他存档(特别是 XML)的轻松使用。但是,我还想保持与已序列化数据的向后兼容性。
polymorphic_binary_iarchive 似乎工作通常,但至少有一种情况会失败:vector.hpp 根据use_array_optimization 更改序列化方法,对于二进制存档设置为is_bitwise_serializable 的任何类型。因此包含vector<size_t> 的类型无法反序列化。
我很想尝试将use_array_optimization 专门用于polymorphic_binary_iarchive(以及类似的oarchive)。是否有任何原因这不起作用,或者有任何其他原因导致这只是 A Bad Idea(TM)?
编辑
我尝试过那个专业:
struct use_array_optimization_in_polymorphic_archive {
template <class T>
struct apply : public boost::serialization::is_bitwise_serializable< T > {};
};
namespace boost {
namespace serialization {
template <>
struct use_array_optimization<boost::archive::polymorphic_iarchive> {
template <class ValueType>
struct apply : boost::mpl::apply1<
use_array_optimization_in_polymorphic_archive,
BOOST_DEDUCED_TYPENAME boost::remove_const<ValueType>::type>::type {};
};
}}
但它不起作用,因为 array.hpp 然后期望 polymorphic_iarchive 实现 load_array,这仅适用于 basic_binary_iprimitive。
我还担心这会改变所有polymorphic_iarchive 实现的行为,而不仅仅是polymorphic_binary_iarchive。需要更多思考...
编辑2
以下是一些演示代码。切换 POLY_ON 以使用多态存档进行反序列化;这适用于双打。切换 VEC_ON 以使用向量,演示问题。 注意:我还没有仔细检查这是否是完全相同的问题,但我有理由确定它是。 NNB:这是使用 Boost 1.59。
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
// #define POLY_ON
#ifdef POLY_ON
#include <boost/archive/polymorphic_binary_iarchive.hpp>
#else
#include <boost/archive/binary_iarchive.hpp>
#endif
// #define VEC_ON
#ifdef VEC_ON
#include <vector>
#include <boost/serialization/vector.hpp>
#endif
class bank_balance {
private:
friend class boost::serialization::access;
template <class archive>
void serialize(archive& ar, const unsigned int version) {
ar & date_;
ar & rate_;
}
#ifdef VEC_ON
std::vector<double> date_;
std::vector<double> rate_;
#else
double date_;
double rate_;
#endif
public:
bank_balance() : date_(0) {}
bank_balance(
#ifdef VEC_ON
std::vector<double> date, std::vector<double> rate
#else
double date, double rate
#endif
)
: date_(date), rate_(rate)
{}
bool operator==(const bank_balance& other) const {
return date_ == other.date_ && rate_ == other.rate_;
}
};
int main() {
std::ofstream ofs("bank_balance.ser");
#ifdef VEC_ON
const bank_balance balance({45367, 45369}, {5.6, 2.43});
#else
const bank_balance balance(45367, 5.6);
#endif
{
boost::archive::binary_oarchive oa(ofs);
oa << balance;
}
bank_balance balance2;
{
std::ifstream ifs("bank_balance.ser");
#ifdef POLY_ON
boost::archive::polymorphic_binary_iarchive ia(ifs);
#else
boost::archive::binary_iarchive ia(ifs);
#endif
ia >> balance2;
}
if (balance == balance2) std::cout << "ok\n";
else std::cout << "dammit\n";
return 0;
}
【问题讨论】:
标签: c++ serialization boost