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

Использование saveobj и loadobj

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

Основным процессом является:

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

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

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

Если вы реализуете saveobj метод без реализации loadobj метод, MATLAB® загружает объект класса по умолчанию, используя текущее определение класса. Добавить a loadobj метод к классу, чтобы создать объект с использованием данных, сохраненных с saveobj способ.

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 a struct вместо объекта. Ваш loadobj метод должен всегда быть в состоянии обрабатывать struct как входной параметр. Вход в loadobj всегда скаляром.

Проблемы загрузки указателя

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

The 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 пытается создать объект с предоставленными данными.

Похожие темы