সিরিয়ালাইজেশন প্রয়োগ করতে আমি নিম্নলিখিত টেমপ্লেটটি ব্যবহার করছি:
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);
}
T
আপনি যে ধরণের সিরিয়ালাইজ করতে চান তা এখানেMode
হ'ল বিভিন্ন ধরণের সিরিয়ালাইজেশনের মধ্যে পার্থক্য করার জন্য একটি ডামি টাইপ, যেমন। একই পূর্ণসংখ্যাটি ছোট এন্ডিয়ান, বিগ এন্ডিয়ান, ভার্টিন্ট ইত্যাদি হিসাবে সিরিয়ালযুক্ত করা যায়
ডিফল্টরূপে Serializer
বস্তুটির ক্রমিকায়িত হওয়ার জন্য প্রতিনিধিত্ব করে। অন্তর্নির্মিত জন্য আপনার একটি টেমপ্লেট বিশেষীকরণ করা উচিতSerializer
।
সুবিধা ফাংশন টেমপ্লেট এছাড়াও সরবরাহ করা হয়।
উদাহরণ স্বরূপ স্বাক্ষরিত পূর্ণসংখ্যার সামান্য এন্ডিয়ান সিরিয়ালাইজেশন:
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++;
}
}
};
তারপরে সিরিয়ালাইজ করতে:
std::vector<char> serialized;
uint32_t val = 42;
serialize<LittleEndianMode>(val, std::back_inserter(serialized));
Deserialize করতে:
uint32_t val;
deserialize(val, serialized.begin(), serialized.end());
বিমূর্ত পুনরুক্তি যুক্তির কারণে, এটি কোনও পুনরুক্তি (যেমন স্ট্রিম পুনরাবৃত্তকারী), পয়েন্টার ইত্যাদির সাথে কাজ করা উচিত should