逐成员连载

Serialization member by member

我已经实现了一个 template<typename T> Serializer,它适用于 类型 T 的任何 普通可复制 对象,只是序列化 sizeof(T) 字节。

然后我针对其他兴趣类型实施了一些(部分)专业化,例如 std::vector<T>std::bacis_string<T>。对于其他类型,我触发 static_assert(is_trivially_copyable<T>::type, "Unsupported type");.

这不是我想要的,因为我想避免序列化,例如,带有 裸指针 的类型,例如:

struct C_style_vector{
    size_t size;
    int* ptr;
};

对于此类类型,我假设用户将定义一个特别的专业化。相反,到目前为止,我的 Serializer 不适用于这样的类型:

struct Simple_type{
    double d;
    std::vector<int> v;
};

即使 Simple_type 的每个成员都可以被我的 class 序列化。

那么,我如何用裸指针捕捉类型? 我如何告诉我的序列化程序序列化仅由可序列化成员组成的类型,逐个成员序列化它?

其实并不简单,如果没有一些用户的补充,在C++中是做不到的,因为在C++中没有反射。

您可以使用类似 boost::fusion 的方法,但在这种情况下用户应使用融合序列。最好的方法是使用 boost::serialization 我认为,用户必须为自己的类型提供 serialize/deserialize 函数。

融合示例。

template<bool Value, typename Next, typename Last>
struct is_serializable_impl
{
private:
   static const bool cvalue = !boost::is_pointer<
   typename boost::remove_reference<
   typename boost::fusion::result_of::deref<Next>::type>::type>::value;
public:
   static const bool value = Value && is_serializable_impl<
   cvalue, typename boost::fusion::result_of::next<Next>::type, Last>::value;
};

template<bool Value, typename Last>
struct is_serializable_impl<Value, Last, Last>
{
   static const bool value = Value;
};

template<typename T>
struct is_serializable :
is_serializable_impl<true, typename boost::fusion::result_of::begin<T>::type,
   typename boost::fusion::result_of::end<T>::type>
{
};

template<typename T, typename = void>
struct serializer;

template<typename T>
struct serializer<T,
typename boost::enable_if<typename 
boost::fusion::traits::is_sequence<T>::type>::type>
{
   static_assert(is_serializable<T>::value, "Not serializable");
};

Live example