dEngine
Simple 2D C++ game engine
Serializer.h
Go to the documentation of this file.
1 #ifndef DENGINE_SERIALIZER_H
2 #define DENGINE_SERIALIZER_H
3 
4 #include <iostream>
5 #include <fstream>
6 #include <vector>
7 #include <cstring>
8 #include "NanoLog.h"
9 
10 namespace dengine {
11  template<typename T>
19  class Serializer {
20  public:
26  Serializer(std::string filePath);
27 
33  bool saveToFile(const T* obj);
39  T loadFromFile();
40  private:
44  std::string path;
51  std::vector<char> serializeObject(const T* obj);
58  bool saveSerializedObject(const std::vector<char>& serializedData);
63  std::vector<char> loadSerializedData();
64 
71  T deserializeData(const std::vector<char>& data);
72  };
73 
74 
75  template<typename T>
76  Serializer<T>::Serializer(std::string filePath){
77  path = filePath;
78  }
79 
80  template<typename T>
81  bool Serializer<T>::saveToFile(const T* obj){
82  std::vector<char> objData = serializeObject(obj);
83  return saveSerializedObject(objData);
84  }
85 
86  template<typename T>
88  std::vector<char> objData = loadSerializedData();
89  return deserializeData(objData);
90  }
91 
92  template <typename T>
93  std::vector<char> Serializer<T>::serializeObject(const T* obj) {
94  std::vector<char> buffer;
95  buffer.resize(sizeof(*obj));
96  std::memcpy(buffer.data(), obj, sizeof(*obj));
97  return buffer;
98  }
99 
100  template<typename T>
101  bool Serializer<T>::saveSerializedObject(const std::vector<char>& serializedData) {
102  std::ofstream file(path, std::ios::binary);
103  if (!file) {
104  LOG_CRIT << "Failed to open file: " << path;
105  return false;
106  }
107 
108  // Save serialized object to file
109  file.write(serializedData.data(), serializedData.size());
110  if (!file) {
111  LOG_CRIT << "Failed to write to file: " << path;
112  return false;
113  }
114 
115  LOG_INFO << "Serialized object saved to file: " << path;
116  return true;
117  }
118 
119  template <typename T>
120  T Serializer<T>::deserializeData(const std::vector<char>& data) {
121  T obj;
122  std::memcpy(&obj, data.data(), sizeof(obj));
123  return obj;
124  }
125 
126  template <typename T>
127  std::vector<char> Serializer<T>::loadSerializedData() {
128  std::ifstream file(path, std::ios::binary | std::ios::ate);
129  if (!file) {
130  std::cerr << "Failed to open file: " << path << std::endl;
131  return {};
132  }
133 
134  std::streamsize fileSize = file.tellg();
135  file.seekg(0, std::ios::beg);
136 
137  std::vector<char> buffer(fileSize);
138  file.read(buffer.data(), fileSize);
139  if (!file) {
140  std::cerr << "Failed to read file: " << path << std::endl;
141  return {};
142  }
143 
144  return buffer;
145  }
146 
147 }
148 
149 
150 
151 #endif //DENGINE_SERIALIZER_H
std::string path
File path to save to/load from.
Definition: Serializer.h:44
bool saveSerializedObject(const std::vector< char > &serializedData)
Saves an object to path.
Definition: Serializer.h:101
T deserializeData(const std::vector< char > &data)
Deserialize data from a vector back into an object.
Definition: Serializer.h:120
std::vector< char > serializeObject(const T *obj)
Serialize an object to a vector<char>
Definition: Serializer.h:93
T loadFromFile()
Load data from a file and deserialize it back to an object.
Definition: Serializer.h:87
Serializer(std::string filePath)
Constructor.
Definition: Serializer.h:76
A serializer.
Definition: Serializer.h:19
#define LOG_INFO
Definition: NanoLog.h:170
std::vector< char > loadSerializedData()
Loads data from file into a vector<char>
Definition: Serializer.h:127
The namespace containing the engine&#39;s code.
Definition: Collider.h:9
bool saveToFile(const T *obj)
Serialize and object and save it to a file.
Definition: Serializer.h:81
#define LOG_CRIT
Definition: NanoLog.h:172