当我们使用命令save matlab.mat Point表示将对象Point保存到matlab.mat文件中,load matlab.mat obj表示装置matlab.mat文件中obj的内容。

1. save保存的内容

1.object所属类的名称以及package的名称
2.object所属类的属性的默认值
3.object中的普通属性的值

  • save保存成mat文件实际上存储的是一个结构体,对应存储着属性名和值

2. 在save之后更改定义,对load的影响

  1. 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,增加属性z,在load之后得到的对象会保存x和y的值,并增加z属性,但内容为空。
  2. 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,将x属性名称改为X,在load之后得到的对象会保存y的值并将x属性更改为X,但内容为空。
  3. 假设Point类中x和y两个对象的默认值为0,在save一个对象之后更改类的定义,将属性默认值改为1,在load之后得到的对象属性值仍然为0,因为在load的过程中并不会调用类的构造函数。
  • 注意类的定义需要在当前路径中,否则会装载错误。

3. 自定义saveobj和loadobj方法

MATLAB在执行save和load命令时,实际上会调用类的saveobj和loadobj方法,就像之前我们讲set和get方法一样,我们可以自定义saveobj和loadobj来自定义保存的格式和内容。

classdef Point < handle  % Point.m
    properties
        x
        y
    end
    methods
        function obj = Point(x,y)
            if nargin ==0
                x = [];
                y = [];
            elseif nargin ==2
            obj.x = x;
            obj.y = y;
            else
                error('Not enough input arguments')
            end
        end
        function s = saveobj(obj)
            s.x = obj.x;
            s.y = obj.y;
        end
    end
    methods(Static)
        function obj = loadobj(s)
            obj = Point();            
            obj.x = s.x;
            obj.y = s.y;
        end
    end
end
  • 需要注意的是,saveobj返回的是一个结构体,对应对象的属性和内容,loadobj的输入是结构体,返回的是一个对象,二者显著的不同在于saveobj是普通方法,而loadobj是静态方法,因为在load的时候对象还没有创建。

4. 继承情况下的saveobj和loadobj

classdef Point2 < Point  % Point2.m
    properties
        z
    end
    methods
        function obj = Point2(x,y,z)
            if nargin == 0
                x = [];
                y = [];
                z = [];
            end
            obj = obj@Point(x,y);
            obj.z = z;
        end
        function s = saveobj(obj)
            s = saveobj@Point(obj);
            s.z = obj.z;
        end
    end
    methods (Static)
        function obj = loadobj(s)
            obj = Point2(s.x,s.y,s.z);
        end
    end
end

和继承中的构造函数一样,为了降低耦合需要调用父类的方法处理父类中的属性,saveobj也是需要调用父类的saveobj保存父类的属性然后再保存子类添加的属性,loadobj要稍微复杂一些,如果直接生搬硬套会出错,这里建议还是耦合吧。如果直接在子类中调用父类的loadobj会出错的,因为保存的对象是Point2类,Point类的loadobj的输入类型不是Point2类,因此在此处会报错。