Tôi đang sử dụng mẫu sau để thực hiện tuần tự hóa:
template <class T, class Mode = void> struct Serializer
{
template <class OutputCharIterator>
static void serializeImpl(const T &object, OutputCharIterator &&it)
{
object.template serializeThis<Mode>(it);
}
template <class InputCharIterator>
static T deserializeImpl(InputCharIterator &&it, InputCharIterator &&end)
{
return T::template deserializeFrom<Mode>(it, end);
}
};
template <class Mode = void, class T, class OutputCharIterator>
void serialize(const T &object, OutputCharIterator &&it)
{
Serializer<T, Mode>::serializeImpl(object, it);
}
template <class T, class Mode = void, class InputCharIterator>
T deserialize(InputCharIterator &&it, InputCharIterator &&end)
{
return Serializer<T, Mode>::deserializeImpl(it, end);
}
template <class Mode = void, class T, class InputCharIterator>
void deserialize(T &result, InputCharIterator &&it, InputCharIterator &&end)
{
result = Serializer<T, Mode>::deserializeImpl(it, end);
}
Đây T
là loại bạn muốn tuần tự hóa Mode
là một loại giả để phân biệt giữa các loại tuần tự khác nhau, ví dụ. cùng một số nguyên có thể được tuần tự hóa như endian nhỏ, endian lớn, varint, v.v.
Theo mặc định, các Serializer
đại biểu nhiệm vụ cho đối tượng được tuần tự hóa. Đối với các loại được xây dựng, bạn nên tạo một chuyên môn mẫu của Serializer
.
Mẫu chức năng thuận tiện cũng được cung cấp.
Ví dụ: tuần tự hóa endian nhỏ của số nguyên không dấu:
struct LittleEndianMode
{
};
template <class T>
struct Serializer<
T, std::enable_if_t<std::is_unsigned<T>::value, LittleEndianMode>>
{
template <class InputCharIterator>
static T deserializeImpl(InputCharIterator &&it, InputCharIterator &&end)
{
T res = 0;
for (size_t i = 0; i < sizeof(T); i++)
{
if (it == end) break;
res |= static_cast<T>(*it) << (CHAR_BIT * i);
it++;
}
return res;
}
template <class OutputCharIterator>
static void serializeImpl(T number, OutputCharIterator &&it)
{
for (size_t i = 0; i < sizeof(T); i++)
{
*it = (number >> (CHAR_BIT * i)) & 0xFF;
it++;
}
}
};
Sau đó để tuần tự hóa:
std::vector<char> serialized;
uint32_t val = 42;
serialize<LittleEndianMode>(val, std::back_inserter(serialized));
Để giải trừ:
uint32_t val;
deserialize(val, serialized.begin(), serialized.end());
Do logic iterator trừu tượng, nó sẽ hoạt động với bất kỳ iterator nào (ví dụ: iterator stream), con trỏ, v.v.