Какой класс должен отвечать за сериализацию?

У меня очень общий вопрос о том, что является лучшим подходом и почему: сделать объект ответственным за сериализацию себя или иметь отдельный Reader а также Writer классы, чтобы сделать это?


Вот иллюстрация. У меня есть формат файла, который состоит из заголовка и серии объектов.

Пример № 1 — встроенная сериализация

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_;
}

В этом случае все детали сериализации попадают в перегруженный << а также >> операторы.

Пример №2 — внешняя сериализация

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 методы, которые используют двоичный формат.

1

Решение

Короткий ответ: IMHO, специализация класса Reader для каждого из ваших классов сущностей была бы лучшим решением.

Длинный ответ:

Вероятно, сериализация не должна беспокоить ваших сущностей (например, заголовок), поэтому эта функциональность не должна принадлежать им (см. принцип единой ответственности в википедии).

С другой стороны, внешний сериализатор, который знает все о классах сущностей, является недопустимым жестким соединением в вашей системе (читаемость и ремонтопригодность могут серьезно пострадать в будущем).

Итак, я предлагаю создать обобщения читателей / писателей, которые знают только, как сериализовать / десериализовать определенный класс сущностей (т.е. HeaderReader / HeaderWriter).

[] ‘С,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]