逐成员连载
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");
};
我已经实现了一个 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");
};