Advertisement
Guest User

Untitled

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