【问题标题】:Save custom objects as struct in matlab在matlab中将自定义对象保存为结构
【发布时间】:2015-12-04 19:34:19
【问题描述】:

数据的生存时间往往比代码长。所以我想将我的对象保存为结构。

这个想法是在自身上递归地覆盖调用structsaveobj方法。

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'

但是保存的对象仍然是foo 类型。任何帮助找出我搞砸的地方将不胜感激。谢谢

万一我在 RHLE6 上使用 R2012a

【问题讨论】:

    标签: matlab oop struct save


    【解决方案1】:

    “问题”是,尽管文档暗示 saveobj 的输出在不知道它来自对象的情况下被保存,但事实并非如此。该结构知道它来自一个对象,并且在加载时将被传递给 loadobj 方法(如果存在)或构造函数(如果不存在)。

    解决这个问题的一种方法是重载save,然后在对象的save 方法内的结构上调用save;另一个是有一个返回结构的方法,然后在该结构上调用save。可能还有一些技巧可以使它更加自动化,这很可能是您真正想要的。

    【讨论】:

    • 感谢您的评论。是的,你的权利我误解了手册。我还使用loadobj 制定了一个丑陋的解决方案。如果您有时间,我会重视您的意见。
    【解决方案2】:

    我发现了一个非常丑陋的破解方法,它可能会对某人有所帮助。由于它的丑陋,我仍然会等待答案。

    正如 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
    

    正如我所说的一个非常丑陋的解决方案。这就是为什么我会等到有聪明人出现并找到更好的方法来解决这个问题,但我想我会发布它以防它对某人有所帮助。

    【讨论】:

      【解决方案3】:

      另一种解决方法可能是在保存对象的同时保存类代码。

      要加载类的对象,您可以先加载代码,将其存储为 m 文件,然后再加载类的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        相关资源
        最近更新 更多