主要内容

loadobj

自定义对象的加载过程

说明

注意

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

b = loadobj(a) 反序列化由 a 表示的对象。如果从 MAT 文件中加载类对象时需要特殊处理,请定义 loadobj 方法。如果定义 saveobj 方法,则定义 loadobj 方法以将对象恢复为所需状态。如果对象的类定义 loadobj 方法,load 会自动调用它。

示例

示例

全部折叠

无法使用对象序列化侦听程序。如果您的类定义一个侦听程序,您可以在反序列化实例时使用 loadobj 来还原该侦听程序。

定义 BankAccount 类。该类包括 AccountBalanceAccountStatus 属性。瞬态属性 AccountManagerListener 保留一个侦听程序对象,该对象根据 AccountBalance 的值更改 AccountStatus

classdef BankAccount < handle
   properties (SetObservable,AbortSet)
      AccountBalance
   end
   properties (Transient)
      AccountManagerListener
   end
   properties
      AccountStatus
   end
   methods
      function obj = BankAccount(initialBalance)
         obj.AccountBalance = initialBalance;
         obj.AccountStatus = "New Account";
         obj.AccountManagerListener = addlistener(obj,...
            "AccountBalance","PostSet",@(src,evt)assignStatus(obj));
      end
      function assignStatus(obj,~)
         if obj.AccountBalance < 0
             obj.AccountStatus = "Overdrawn";
         else
            obj.AccountStatus = "Open";
         end
      end
   end
end

创建一个 BankAccount 的实例。

x = BankAccount(100)
x = 

  BankAccount with properties:

            AccountBalance: 100
    AccountManagerListener: [1×1 event.proplistener]
             AccountStatus: "New Account"

AccountBalance 属性设置为负值,并检查对 AccountStatus 的更改。

x.AccountBalance = -100
x = 

  BankAccount with properties:

            AccountBalance: -100
    AccountManagerListener: [1×1 event.proplistener]
             AccountStatus: "Overdrawn"

如果调用 save 来序列化 x,则不会序列化 AccountManagerListener。要在调用 load 时还原事件侦听程序,请为 BankAccount 定义一个 loadobj 方法,该方法重新创建侦听程序并将其分配给 AccountManagerListener

methods (Static)
   function obj = loadobj(obj)
      if isstruct(obj)
         initialBalance = obj.AccountBalance;
         obj = BankAccount(initialBalance);
      else
         obj.AccountManagerListener = addlistener(obj,...
         "AccountBalance","PostSet",@(src,evt)assignStatus(obj));
      end
   end
end

保存 x,然后清除它。加载 x 以确认 loadobj 已重新创建事件侦听程序。

save("C:\yourpath\AccountTest.mat","x")
clear x
load("C:\yourpath\AccountTest.mat","x")
x
x = 

  BankAccount with properties:

            AccountBalance: -100
    AccountManagerListener: [1×1 event.proplistener]
             AccountStatus: "Overdrawn"

输入参数

全部折叠

要从 MAT 文件反序列化的内容,可以是:

  • 对象

  • load 创建的结构体(如果 load 无法解析该对象)

  • 由对应的 saveobj 方法创建的结构体

输出参量

全部折叠

由 MATLAB® 传递给 load 函数的对象。类 loadobj 方法返回的值通常是要加载的类的对象。但是,loadobj 方法可以返回不同类的对象,或与新的类定义匹配的更新对象。

提示

  • loadobj 定义为静态方法。

  • 实现 loadobj 方法以使用标量对象或结构体。当您反序列化对象数组时,load 对已保存数组的每个元素调用 loadobj

  • 如果类的新版本删除、重命名或更改了属性的验证,load 在尝试设置已更改或删除的属性时可能生成错误。如果该类定义一个 loadobj 方法,MATLAB 将保存的值返回 struct 中的 loadobj 方法。如果保存的对象派生自多个具有同名私有属性的超类,则 struct 仅包含最直接超类的属性值。

  • 加载子类对象时,load 仅调用子类 loadobj 方法。如果超类定义 loadobj 方法,则子类将继承该方法。但是,继承的方法可能不会执行必要的操作来加载子类对象。如果您的应用程序需要,请考虑覆盖超类 loadobj 方法。您也可以从子类 loadobj 中调用超类 loadobj

版本历史记录

在 R2006a 之前推出