Задать вопрос
Dyikot
@Dyikot

Как можно через ООП сериализировать в разные форматы в едином стиле?

Сейчас использую подход свободных функий + ADL:
void to_json(json& j, const MyObject& o);
void from_json(const json& j, MyObject& o);

void to_binary(binary_buffer& b, const MyObject& o);
void from_binary(const binary_buffer& b, MyObject& o);

Мне в принципе такой подход нравится, но требование сделать на ООП. Смотрю в сторону шаблона "Посетитель". Что можете посоветовать?
  • Вопрос задан
  • 291 просмотр
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
Решения вопроса 3
opium
@opium
Просто люблю качественно работать
а точно нужен Visitor? он нужен для double dispatch: иерархия классов и для каждого вида своя логика. У тебя один MyObject, наследников не видно, это как из пушки по воробьям. Проще держать полиморфизм на стороне формата: интерфейс ISerializer с виртуальными write() под каждый тип поля, а у MyObject — void serialize(ISerializer&) const и void deserialize(IDeserializer&). JSON и binary тогда просто разные реализации этих интерфейсов, без accept()/visit() зоопарка. Visitor понадобится только если появится реальная иерархия объектов.
Ответ написан
maaGames
@maaGames
Погроммирую программы
Это же домашнее задание от препода, а не реальная потребность?

Может будет достаточно типа такого? Внутри вызывать всё те же to-from.

class SerializerBase;

class JsonSerializer;
class BinarySerializer;

class MyObject
{
     void Serialize( SerializerBase * ptr );
};
Ответ написан
@Petr_Mechik
void serialize(ISerializer&) const? По заветам Мейерса передавайте интерфейс по константной ссылке на базовый класс, а не по значению.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы