Main Content

基本的な saveobjloadobj のパターン

saveobjloadobj の使用

ユーザー クラスの要件に応じて、saveobj および loadobj メソッドをさまざまな方法で使用できます。ここでのパターンは、単純な方法では対処できないさまざまな問題を解決する柔軟な方法です。

基本的なプロセスは次のとおりです。

  • saveobj を使用して、必要不可欠なすべてのデータを struct に保存し、オブジェクト全体は保存しない。

  • loadobj を使用して、保存したデータからオブジェクトを再構成する。

struct フィールドにプロパティ値を保存できない場合、この方法は有用ではありません。ファイル識別子など、保存できないデータは loadobj メソッドで再生成できる場合があります。

loadobj メソッドを実装せずに saveobj メソッドを実装した場合、MATLAB® は現在のクラス定義を使用して、クラスの既定のオブジェクトを読み込みます。saveobj メソッドで保存したデータを使用してオブジェクトを作成するには、クラスに loadobj メソッドを追加してください。

saveobj

このパターンでは、クラスのオブジェクトを受け入れて struct を返す通常のメソッドとして saveobj を定義します。

  • 各プロパティ値を同名の構造体フィールドにコピーします。

  • オブジェクトをリビルドするのに必要なデータのみを保存できます。オブジェクト階層全体 (グラフによって作成されたものなど) の保存は避けてください。

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

loadobj

loadobj を静的メソッドとして定義します。クラス コンストラクターを呼び出してオブジェクトを作成します。そして、loadobj に渡された struct からプロパティに値を代入します。このデータを使用して、保存されていないプロパティを再生成します。

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 でエラーが発生した場合、loadloadobj にオブジェクトではなく struct を渡します。loadobj メソッドは、常に struct を入力引数として扱えるようにしておかなければなりません。loadobj への入力は常にスカラーです。

読み込みの問題の処理

loadobj は、saveobj メソッドを使用していない場合でも struct 入力を処理できます。

GraphExpression クラスは、データの指定範囲にわたって MATLAB 式のグラフを作成します。GraphExpressionloadobj メソッドを使用して、オブジェクトで保存されていないグラフを再生成します。

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

save および load オブジェクト

無名関数を使用し、データの範囲を入力としてオブジェクトを作成します。

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 がオブジェクトを作成できないまま structloadobj に渡すと、loadobj は与えられたデータでオブジェクトの作成を試みます。

関連するトピック