Рекомендации по загрузке объекта из сериализованного XML в C#

Привет,

У меня есть конкретный объект, который может быть создан из файла как таковой:

public class ConfigObj
{
     public ConfigObj(string loadPath)
     {
          //load object using .Net's supplied Serialization library
          //resulting in a ConfigObj object
          ConfigObj deserializedObj = VoodooLoadFunction(loadpath); 

          //the line below won't compile
          this = thisIsMyObj; 
     }
}

По сути, я хочу сказать: «Хорошо, а теперь этот объект, который мы только что десериализовали, это тот объект, которым мы на самом деле являемся». Есть несколько способов сделать это, и мне интересно, какой из них считается наилучшей практикой. Мои идеи:

  • Создайте функцию копирования в меня, которая копирует поле объекта за полем. Это текущая реализация, и я почти уверен, что это ужасная идея, поскольку всякий раз, когда к объекту добавляется новый член, мне нужно также не забыть добавить его в функцию «копировать в меня», и это никак не поддерживается .
  • Создайте статический метод для класса ConfigObj, который фактически действует как конструктор для загрузки объекта. Это звучит намного лучше, но не очень хорошо.

Однако я не совсем доволен ни тем, ни другим. Какова признанная лучшая практика здесь?


person AlexeyMK    schedule 16.10.2008    source источник


Ответы (3)


Второй вариант – это так называемый фабричный метод, широко распространенный метод проектирования. Если вы используете этот метод, вы можете обнаружить, что вам нужно знать тип класса, который вы будете загружать, прежде чем вы действительно загрузите класс. Если вы столкнулись с такой ситуацией, вы можете использовать фабрику более высокого уровня, которая просматривает поток и вызывает метод фабрики для соответствующего типа класса.

person Greg Hewgill    schedule 16.10.2008
comment
Спасибо. Считается ли приемлемым (по крайней мере, в ограниченных случаях, когда я загружаю только этот конкретный тип) создание метода Factory внутри того же класса, что и загружаемый метод? По какой-то причине у меня сложилось впечатление, что на фабриках обычно были свои классы. - person AlexeyMK; 16.10.2008
comment
Конечно, вы можете создать статический фабричный метод внутри самого класса. Вам нужна абстракция фабрики более высокого уровня, только если у вас есть целое дерево потенциальных объектов для работы. Для вашей ситуации просто создайте статический метод, который возвращает вновь выделенный экземпляр вашего класса. - person Greg Hewgill; 16.10.2008

Нет ничего плохого в том, чтобы использовать статический метод вместо конструктора. Фактически, у него есть ряд преимуществ.

person Jon Skeet    schedule 16.10.2008

Я всегда использую статический метод. Обычно это своего рода иерархия, которая загружается, поэтому метод нужен только корневому объекту. И это не совсем необычный подход в среде .NET (например, Graphics.FromImage), поэтому он должен подойти пользователям вашего класса.

person OregonGhost    schedule 16.10.2008