У меня очень общий вопрос о том, что является лучшим подходом и почему: сделать объект ответственным за сериализацию себя или иметь отдельный Reader
а также Writer
классы, чтобы сделать это?
Вот иллюстрация. У меня есть формат файла, который состоит из заголовка и серии объектов.
class Header
{
friend std::ostream& operator<< (std::ostream& out, const Header& header);
friend std::istream& operator>> (std::istream& in, Header& header);
}
class Object
{
friend std::ostream& operator<< (std::ostream& out, const Object& object);
friend std::istream& operator>> (std::istream& in, Object& object);
}
class Reader
{
void readHeader(Header& header) { ifs_ << header; }
void readObject(Object& object) { ifs_ << object; }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { header >> ofs_ }
void writeObject(Object const& object) { object >> ofs_ }
private:
ofstream ofs_;
}
В этом случае все детали сериализации попадают в перегруженный <<
а также >>
операторы.
class Header
{
}
class Object
{
}
class Reader
{
void readHeader(Header& header) { // serialization details go here }
void readObject(Object& object) { // serialization details go here }
private:
ifstream ifs_;
}
class Writer
{
void writeHeader(Header const& header) { // serialization details go here }
void writeObject(Object const& object) { // serialization details go here }
private:
ofstream ofs_;
}
Примечание: я предоставляю <<
а также >>
операторы просто в качестве примера, это не значит, что я обязательно хочу хранить данные в виде текста. Эти методы могут быть заменены serialize
/deserialize
методы, которые используют двоичный формат.
Короткий ответ: IMHO, специализация класса Reader для каждого из ваших классов сущностей была бы лучшим решением.
Длинный ответ:
Вероятно, сериализация не должна беспокоить ваших сущностей (например, заголовок), поэтому эта функциональность не должна принадлежать им (см. принцип единой ответственности в википедии).
С другой стороны, внешний сериализатор, который знает все о классах сущностей, является недопустимым жестким соединением в вашей системе (читаемость и ремонтопригодность могут серьезно пострадать в будущем).
Итак, я предлагаю создать обобщения читателей / писателей, которые знают только, как сериализовать / десериализовать определенный класс сущностей (т.е. HeaderReader / HeaderWriter).
[] ‘С,Других решений пока нет …