Интеграция сериализации и десериализации в шаблон проектирования Builder с использованием C # - PullRequest
6 голосов
/ 19 мая 2011

Я реализую шаблон Builder , чтобы сгенерировать набор объектов.Затем эти объекты необходимо сериализовать в XML и десериализовать из XML.

Я знаю, как выполнять сериализацию и десериализацию, однако я не уверен, как интегрировать их в шаблон проектирования.

Например,предположим, мой код использует конструктор для создания продуктов foo и bar.Моей первой мыслью было поставить функцию сериализации для каждого из них, потому что каждый продукт знает, что сериализировать.

Моей следующей мыслью было поместить десериализацию в Director или ConcreteBuilder.

Что я делаюНе нравится, что функции сериализации и десериализации будут находиться в разных местах - одна в файле для объявления объектов foo и bar, а другая в файлах для чего-то другого.Я обеспокоен тем, что они могут перестать синхронизироваться друг с другом, когда я работаю над классами продуктов.

Моя последняя мысль была о том, чтобы Director или ConcreteBuilder выполнили сериализацию и десериализацию.Что мне не нравится в этом, так это то, что продукты должны знать, какой строитель использовался, или знать, кто такой директор.

Чтобы уточнить - существует две ситуации, когда продукт может быть создан:

  1. Пользователь нажимает кнопку в пользовательском интерфейсе
  2. Пользователь загружает проект XML

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Разве вы не можете просто иметь статический класс сериализации / десериализации и создать универсальный метод, который может принимать любой тип объекта?Разве шаблон не просто для создания объектов?Вы можете затем сериализовать, как вы хотите?

Что-то вроде:

public static string Serialize<T>(T data)
    {
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
       StringWriter sw = new StringWriter();
       xmlSerializer.Serialize(sw, data);
       return sw.ToString();

    }
0 голосов
/ 20 мая 2011

Мое текущее решение состоит в том, чтобы Продукт выполнил сериализацию, а ConcreteBuilder выполнил десериализацию, а затем поместил объявления Product и его ConcreteBuilder в один и тот же исходный файл.

Хотя задача распределена по двум классам, она, по крайней мере, хранится в одном файле.

Любые лучшие решения приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...