Первый метод (один с участием saveobj
) на самом деле правильно , Для целей обсуждения давайте рассмотрим этот простой класс:
classdef testclass
properties
x
end
methods
function this = testclass(x)
this.x = x ;
end
function a = saveobj(this)
a = this.x ;
end
end
end
Когда вы просите MATLAB, чтобы сохранить экземпляр вашего класса, он будет использовать метод saveobj
при вызове save
, если таковой существует. Результатом этого метода может быть объект, структура, массив, что угодно. Вы хотите, чтобы проверить, что это произошло, и вы что-то естественное, как это:
>> obj = testclass('hi')
obj =
testclass with properties:
x: 'hi'
>> save tmp.mat obj
>> clear all
>> load tmp.mat
>> obj
obj =
testclass with properties:
x: []
>>
И это где я подозреваю, возникает ваша путаница. Вы ожидаете, что obj будет char
, но вместо этого это пустой объект класса testclass
. (Вы можете убедиться, что это всего лишь экземпляр объекта, основанный на сохраненном определении класса, и что он не создается путем вызова пустого конструктора.)
Это может показаться довольно запутанным, пока вы не поймете, как работает loadobj
, Чтобы MATLAB мог узнать, какой статический метод вызывает нагрузку, он сохраняет определение класса в сочетании с любым результатом, который вы предоставляете, из вашего настраиваемого метода saveobj
. Когда вы вызываете load
, он загружает определение класса и вызывает статический метод loadobj
, если он существует. Мы можем проверить это, изменив определение класса выше:
classdef testclass
properties
x
end
methods
function this = testclass(x)
this.x = x ;
end
function a = saveobj(this)
a = this.x ;
end
end
methods(Static)
function this = loadobj(a)
this = testclass(a) ;
end
end
end
Если установить точку останова в методе loadobj
вы можете проверить, что тип a
действительно char
, как вы ожидаете.
Спасибо! Это именно то, чего я хотел. Я просто пропустил строку 'myProp = a.myProp;' –