数据往往比代码存活更长时间。所以我想将我的对象保存为struct。
这个想法是覆盖自己递归调用saveobj
的{{1}}方法。
struct
我现在打电话给:
classdef foo < handle
properties
Data = 12
end
methods
function data = saveobj(o)
data = struct(o);
end
end
end
但是,保存的对象仍为>> bar = foo;
>> save('test', 'bar')
>> bar2 = load('test')
>> class(bar2.bar)
'foo'
类型。任何帮助搞清楚我搞砸的地方将不胜感激。感谢
如果重要的话我在RHLE6上使用R2012a
答案 0 :(得分:2)
&#34;问题&#34;尽管文档暗示saveobj
的输出被保存而不知道它来自一个对象,但事实并非如此。结构知道它来自一个对象,加载后将传递给loadobj
方法(如果存在),或构造函数(如果它不存在)。
解决此问题的一种方法是重载save
,然后在对象的save
方法中调用结构上的save
;另一种方法是使用一个方法返回一个结构,然后在该结构上调用save
。可能还有一些黑客可以使它更自动化,这很可能是你真正想要的。
答案 1 :(得分:1)
我找到了一个真正丑陋的黑客,这可能对某人有帮助。由于它的丑陋,我仍然会等待答案。
正如Phil已经指出的那样,类名仍然与文件一起存储。但是,我们可以使用同名的其他文件欺骗matlab
。
我原来的课程看起来像这样:
classdef foo < handle
%// This is the original class used to some stuff and it holds
%// important data. But I lost it over time...
properties
Data = 12
end
methods
function data = saveobj(o)
for f = properties(o)'
data.(f{1}) = saveobj(o.(f{1}));
end
end
end
end
现在,因为我假设我没有原始资源,所以我可以使用虚拟类来加载数据。
classdef foo < handle
%// This is the pretender class source. Since I lost the source of
%// the original class.
methods (Static)
function data = loadobj(data)
global DATA
DATA = data;
end
end
end
加载自然会失败,但我可以通过调用以下方法将结构提取提取到loadobj
方法中:
global DATA
正如我所说的一个非常难看的解决方案。这就是为什么我要等到有人聪明才能找到解决这个问题的更好方法的原因,但我认为我发布它以防万一它会帮助某人。
答案 2 :(得分:1)
另一个黑客攻击可能是在保存对象时保存类代码。
要加载类的对象,可以先加载代码,将其存储为m文件,然后加载类的对象。