Основной saveobj и loadobj Шаблон

Используя saveobj и loadobj

В зависимости от требований вашего класса существуют различные способы, можно использовать методы loadobj и saveobj. Этот шаблон является гибким способом решить проблемы, которые вы не можете решить более простыми средними значениями.

Базовый процесс:

  • Используйте saveobj, чтобы сохранить все существенные данные в struct и не сохранить объект.

  • Используйте loadobj, чтобы восстановить объект от сохраненных данных.

Этот подход не полезен в случаях, где вы не можете сохранить значения свойств в поле struct. Данные, которые вы не можете сохранить, такие как идентификатор файла, можно возможно регенерировать в методе loadobj.

saveobj

Для этого шаблона задайте saveobj как обычный метод, который принимает объект класса и возвращает struct.

  • Скопируйте каждое значение свойства в поле структуры того же имени.

  • Можно сохранить только данные, которые необходимы, чтобы восстановить объект. Постарайтесь не сохранять целые иерархии объектов, такие как созданные графиками.

methods
   function s = saveobj(obj)
      s.Prop1 = obj.Prop1;
      s.Prop2 = obj.Prop2
      s.Data = obj.GraphHandle.YData;
   end
end

loadobj

Задайте loadobj как статический метод. Создайте объект путем вызова конструктора класса. Затем присвойте значения свойствам от struct, переданного loadobj. Используйте данные, чтобы регенерировать свойства, которые не были сохранены.

methods(Static)
   function obj = loadobj(s)
      if isstruct(s)
         newObj = ClassConstructor; 
         newObj.Prop1 = s.Prop1;
         newObj.Prop2 = s.Prop2
         newObj.GraphHandle = plot(s.Data);
         obj = newObj;
      else
         obj = s;
      end
   end
end

Если функция load сталкивается с ошибкой, load передает loadobj struct вместо объекта. Ваш метод loadobj должен всегда мочь обработать struct как входной параметр. Вход к loadobj всегда является скаляром.

Решение проблем загрузки

loadobj может обработать вход struct, даже если вы не используете метод saveobj.

Класс GraphExpression создает график выражения MATLAB® в заданной области значений данных. GraphExpression использует свой метод loadobj, чтобы регенерировать график, который не сохранен с объектом.

classdef GraphExpression
   properties
      FuncHandle
      Range
   end
   methods
      function obj = GraphExpression(fh,rg)
         obj.FuncHandle = fh;
         obj.Range = rg;
         makeGraph(obj)
      end
      function makeGraph(obj)
         rg = obj.Range;
         x = min(rg):max(rg);
         data = obj.FuncHandle(x);
         plot(data)
      end
   end
   methods (Static)
      function obj = loadobj(s)
         if isstruct(s)
            fh = s.FuncHandle;
            rg = s.Range;
            obj = GraphExpression(fh,rg);
         else
            makeGraph(s);
            obj = s;
         end
      end
   end
end

Сохранение и загрузка объекта

Создайте объект с анонимной функцией и областью значений данных как входные параметры:

h = GraphExpression(@(x)x.^4,[1:25])
h = 

  GraphExpression with properties:

    FuncHandle: @(x)x.^4
         Range: [1x25 double]

Сохраните объект GraphExpression и закройте график:

save myFile h
close

Загрузите объект. MATLAB воссоздает график:

load myFile h

Если функция load не может создать объект и передает struct loadobj, loadobj пытается создать объект со снабженными данными.

Похожие темы