주요 콘텐츠

saveobj

객체의 저장 절차 사용자 지정

설명

참고

mixin을 사용하면 속성의 추가, 삭제, 이름 바꾸기 기능을 포함하여 객체 직렬화와 역직렬화를 더 효과적으로 제어할 수 있기 때문에 loadobjsaveobj보다는 matlab.mixin.CustomElementSerialization 클래스가 권장됩니다. (R2024b 이후)

b = saveobj(a)a의 클래스가 saveobj 메서드를 정의하는 경우 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 메서드가 수정되었습니다. 네 번째 필드가 있는 경우 loadobjWorkPhone 속성을 그 값으로 설정합니다. 필드가 없으면 WorkPhone 속성은 "unknown"으로 설정됩니다.

  • 숨겨진 새로운 과도형(transient) 속성인 SaveInOldFormat을 사용하면 클래스 사용자가 WorkPhone 속성값 없이 이전 형식으로 클래스 인스턴스를 직렬화할지 여부를 지정할 수 있습니다. saveobj 메서드는 SaveInOldFormatfalse인 경우에만 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 이전에 개발됨