Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include <map>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6.  
  7. // Для простых примитивных типов (int, bool, char и т. д.) и plain old data
  8. template <typename T>
  9. void Serialize(T pod, std::ostream& out) {
  10.     size_t sz = 1;
  11.     out.write(reinterpret_cast<char*>(&sz), sizeof(sz));
  12.     out.write(reinterpret_cast<const char*>(&pod), sizeof(T));
  13. }
  14.  
  15. void Serialize(const std::string& str, std::ostream& out) {
  16.     size_t sz = str.size();
  17.     out.write(reinterpret_cast<char*>(&sz), sizeof(sz));
  18.     out.write(reinterpret_cast<const char*>(str.data()), sz * sizeof(char));
  19. }
  20.  
  21. template <typename T>
  22. void Serialize(const std::vector<T>& data, std::ostream& out) {
  23.     size_t sz = data.size();
  24.     out.write(reinterpret_cast<char*>(&sz), sizeof(sz));
  25.     out.write(reinterpret_cast<const char*>(data.data()), sz * sizeof(T));
  26. }
  27.  
  28. template <typename T1, typename T2>
  29. void Serialize(const std::map<T1, T2>& data, std::ostream& out) {
  30.     size_t sz = data.size();
  31.     out.write(reinterpret_cast<char*>(&sz), sizeof(sz));
  32.     for (auto& it : data) {
  33.         Serialize(it.first, out);
  34.         Serialize(it.second, out);
  35.     }
  36. }
  37.  
  38. template <typename T>
  39. void Deserialize(std::istream& in, T& pod) {
  40.     size_t sz;
  41.  
  42.     in.read(reinterpret_cast<char*>(&sz), sizeof(size_t));
  43.     in.read(reinterpret_cast<char*>(&pod), sizeof(T));
  44. }
  45.  
  46. void Deserialize(std::istream& in, std::string& str) {
  47.     size_t sz;
  48.  
  49.     in.read(reinterpret_cast<char*>(&sz), sizeof(size_t));
  50.     str.resize(sz);
  51.  
  52.     in.read(reinterpret_cast<char*>(str.data()), sz * sizeof(char));
  53. }
  54.  
  55. template <typename T>
  56. void Deserialize(std::istream& in, std::vector<T>& data) {
  57.     size_t sz;
  58.  
  59.     in.read(reinterpret_cast<char*>(&sz), sizeof(size_t));
  60.     data.resize(sz);
  61.  
  62.     in.read(reinterpret_cast<char*>(data.data()), sz * sizeof(T));
  63. }
  64.  
  65. template <typename T1, typename T2>
  66. void Deserialize(std::istream& in, std::map<T1, T2>& data) {
  67.     size_t sz;
  68.  
  69.     in.read(reinterpret_cast<char*>(&sz), sizeof(size_t));
  70.     for (size_t i = 0; i < sz; ++i) {
  71.         std::pair<T1, T2> p;
  72.         Deserialize(in, p.first);
  73.         Deserialize(in, p.second);
  74.         data[p.first] = p.second;
  75.     }
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement