主要内容

saveobj

自定义对象的保存过程

说明

注意

推荐使用 matlab.mixin.CustomElementSerialization 类而不是 loadobjsaveobj,因为 mixin 能够更好地控制一个对象的序列化和反序列化方式,包括能够添加、删除和重命名属性。 (自 R2024b 起)

如果 a 的类定义 saveobj 方法,则 b = saveobj(a)save 函数调用。save 将返回的值 b 写入 MAT 文件。

示例

示例

全部折叠

ContactEntry 类定义三个属性。该类定义将这些属性值保存在一个结构体中的 saveobj 方法,以及从保存的结构体中重新创建对象的 loadobj 方法。

classdef ContactEntry
   properties
      Name
      Email
      Cell
   end
   methods
      function s = saveobj(obj)
         s.Name = obj.Name;
         s.Email = obj.Email;
         s.Cell = obj.Cell;
      end
   end
   methods (Static)
      function obj = loadobj(s)
         if isstruct(s)
            newObj = ContactEntry;
            newObj.Name = s.Name;
            newObj.Email = s.Email;
            newObj.Cell = s.Cell;
            obj = newObj;
         else
            obj = s;
         end
      end
   end
end

创建一个 ContactEntry 的实例并保存它。

a = ContactEntry;
a.Name = "Sandy Trent";
a.Email = "strent@notacompany.com";
a.Cell = "617-555-1212";
save("C:\yourpath\ContactFile.mat","a");

修改 ContactEntry 以包含保留工作电话号码的新属性。

classdef ContactEntry
   properties
      Name
      Email
      Cell
      WorkPhone
   end
   properties (Transient,Hidden)
      SaveInOldFormat = false;
   end
   methods
      function s = saveobj(obj)
         s.Name = obj.Name;
         s.Email = obj.Email;
         s.Cell = obj.Cell;
         if ~obj.SaveInOldFormat
             s.WorkPhone = obj.WorkPhone;
         end
      end
   end
   methods (Static)
      function obj = loadobj(s)
         if isstruct(s)
            newObj = ContactEntry;
            newObj.Name = s.Name;
            newObj.Email = s.Email;
            newObj.Cell = s.Cell;
            if numel(fieldnames(s)) == 4
                newObj.WorkPhone = s.WorkPhone;
            else
                newObj.WorkPhone = "unknown";
            end
            obj = newObj;
         else
            obj = s;
         end
      end
   end
end
为了保持这两个类版本之间的兼容性:

  • loadobj 方法已修改,以检查序列化结构体中的第四个字段。如果有第四个字段,loadobj 会将 WorkPhone 属性设置为该值。否则,它将 WorkPhone 属性设置为 "unknown"

  • 新的瞬态隐藏属性 SaveInOldFormat 使类用户能够指定是否以旧格式序列化该类的实例(不带 WorkPhone 属性值)。如果 SaveInOldFormatfalse,则 saveobj 方法仅保存 WorkPhone 值。

从内存中清除现有实例 a,并在该类的新定义下加载 a。修订后的 loadobj 方法将保存的数据识别为来自该类的旧版本,并适当地设置 WorkPhone

clear a
load("C:\yourpath\ContactFile.mat","a")
a
a = 

  ContactEntry with properties:

         Name: "Sandy Trent"
        Email: "strent@notacompany.com"
         Cell: "617-555-1212"
    WorkPhone: "unknown"
同样,您可以使用值 WorkPhone 创建该类的一个新实例,并且 saveobjloadobj 方法都按照新类定义的预期保存和加载该值。

输入参数

全部折叠

要序列化的对象。

输出参量

全部折叠

由 MATLAB® 传递给 save 函数的数据,可以是:

  • 对象

  • 存储在结构体中的属性名称和当前值

提示

  • 实现 saveobj 方法以使用标量对象或结构体。当您保存对象数组时,save 对数组的每个元素调用 saveobj

版本历史记录

在 R2006a 之前推出