exponenta event banner

Основной saveobj и loadobj Образец

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

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

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

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

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

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

При внедрении saveobj способ без реализации loadobj MATLAB ® загружает объект класса по умолчанию с использованием текущего определения класса. Добавить 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 способ.

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

Связанные темы