Основной 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 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 к loadobjloadobj попытки создать объект со снабженными данными.

Похожие темы