Как реализовать открытие сереализованного объекта из файла? - вопрос №309036

Есть обьект settings сереализованного класса SettingClass, есть файл Settings.dat, возможно ли сделать так, чтобы объект загружал все поля из файла таким способом: settings.LoadFromFile(«Settings.dat») ?

Мои попытки были следующими:

Внутри класса создал обьект класса BinarryFormatter, создал обьект класса SettingClass и назвал его temp внутри себя, затем десериализовал файл в объект temp, после по-отдельности передал значение всех полей из temp в this (То естьв самого себя). Линия дебаггера дошла только до строки

 settings.LoadFromFile(«Settings.dat»);

, внутрь ее не полезла и выдала ошибку: Адресат вызова создал исключение — TargenInvocationExeption

21.07.12
5 ответов

Лучший ответ по мнению автора

21.07.12
Лучший ответ по мнению автора

Другие ответы

из за переписку — уточню

по отношению к классу, который можно сохранять и восстанавливать, требуется только одно шаманское дивжение

[Serializable]

public class ClassКоторыйМожноСохранятьИВосстанавливать

{

..................

}

все. ни какой магии по отношению к классу больше не надо и не надо ни чего делать внутри класса для того что бы он стал сохряняемо-восстанавливаемым

var x = (ClassКоторыйМожноСохранятьИВосстанавливать)bf.Deserialize(fs);

и

bf.Serialize(fs, x);

собственно сами акты сохранения и восстановления выполняются где то в другом месте, там где Вы решите что пора класс сохранять или восстанавливать

ни каких миграций из tmp в this не надо, это излишнее нагромождение кода, которое влечет только плохое понимание и как следствие ошибки

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


22.07.12

То есть иметь возможность сохранить обьект своего класса способом myObject.SaveToFile(«NameOfTheFile.dat») будет не самым изящным решением?

22.07.12

давайте сначала с загрузкой

если Вы пытаетесь загрузить класс с помощью самого класса, Вам придется создать экземляр и заниматься копированием полей из tmp — вот что является довольно воспаленным нагромождением

смотрите в примере на скринах — статическая функция генереции нового экземпляра (фабрика класса)

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

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

public class ClassКоторыйМожноСохранятьИВосстанавливать

{

..................

   public static ClassКоторыйМожноСохранятьИВосстанавливать ФункцияЧтения(sytring filename)

   {

      ..........

      return bf.Deserialize(fs);

   }

}

это уже где то как то приемлемо

описание статической функции для сохранения тривиально (при условии понимания только что описанного подхода)

22.07.12

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

сравните внимательно изменения в описании класса на скрине, то что выше — без изменений

http://shot.qip.ru/008z9U-2ZU0L5DQi/

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

логика загрузки может быть в общем случае совершенно иная

так же внимательно разберите метод сохранения — он не статический, но он и не нужен при отсутсвии экземпляра класаа (нечего сохранять), зато он всегда знает кого сохранять — себя (this)

вот во что превращается тело основной программы

http://shot.qip.ru/008z9U-1ZU0L5DQj/

обратие внимание на способ вызова статического метода

теперь можно говорить об элегантности решения и достаточно логичной инкапсуляции

тем не менее повторюсь - ни где не требуется копирование полей между экземплярами

в этом и состоит суть правильно организованной сериализации

22.07.12

заканчивая тему:

можно еще развить идеологию ООП в этом примере

http://shot.qip.ru/008z9U-1ZU0L5DQm/

тут лучше видно что временная переменная нужня только для того что бы выполнить закрытие файла перед завершением метода

тогда вызывающая программа окончательно абстрагируется от вопроса откуда берется экземпляр обьекта

http://shot.qip.ru/008z9U-2ZU0L5DQn/

22.07.12

Виталий

Читать ответы
Посмотреть всех экспертов из раздела Технологии > .Net/C#
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store