当我们使用命令save matlab.mat Point
表示将对象Point保存到matlab.mat文件中,load matlab.mat obj
表示装置matlab.mat文件中obj的内容。
- save保存的内容
1.object所属类的名称以及package的名称
2.object所属类的属性的默认值
3.object中的普通属性的值
- save保存成mat文件实际上存储的是一个结构体,对应存储着属性名和值
- 在save之后更改定义,对load的影响
- 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,增加属性z,在load之后得到的对象会保存x和y的值,并增加z属性,但内容为空。
- 假设Point类有x和y两个属性,在save一个对象之后更改类的定义,将x属性名称改为X,在load之后得到的对象会保存y的值并将x属性更改为X,但内容为空。
- 假设Point类中x和y两个对象的默认值为0,在save一个对象之后更改类的定义,将属性默认值改为1,在load之后得到的对象属性值仍然为0,因为在load的过程中并不会调用类的构造函数。
- 注意类的定义需要在当前路径中,否则会装载错误。
- 自定义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的时候对象还没有创建。
- 继承情况下的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类,因此在此处会报错。