2

シリアル化と逆シリアル化の実装が面倒で、必要ないMatlabクラスがあります。したがって、私はsaveobj次のようにオーバーロードしました:

    function sobj = saveobj(self)
         sojb = [];
         error(['atmlab:' mfilename ':nostoring'], ...
            ['You tried to store %s %s.  Loading is impossible, ' ...
             'therefore I refuse to store.  Sorry.'], ...
             class(self), self.name);
    end

残念ながら、私がこれをテストすると、Matlabは役に立ち、警告をエラーに変えようとします(何らかの理由で2回):

>> save('/tmp/test.mat', 'X')
Warning: While saving an object of class 'SatDataset':
You tried to store SatDataset amsua.  Loading is impossible, therefore I refuse to store.  Sorry.
(Type "warning off atmlab:SatDataset:nostoring" to suppress this warning.) 
Warning: While saving an object of class 'SatDataset':
You tried to store SatDataset amsua.  Loading is impossible, therefore I refuse to store.  Sorry.
(Type "warning off atmlab:SatDataset:nostoring" to suppress this warning.) 

文書化されていない機能を使用して、警告をエラーに変えることができます:

>> warning error atmlab:SatDataset:nostoring
>> save('/tmp/test.mat', 'X')
Error using save
While saving an object of class 'SatDataset':
You tried to store SatDataset amsua.  Loading is impossible, therefore I refuse to store.  Sorry.

Unexpected error status flag encountered.  Resetting to proper state.

しかし、これは満足のいくものではありません。文書化されていない機能に依存したくないし、ユーザーにそうするように強制したくないからです。

どうすれば効果的にエラーをスローし、ユーザーがクラスからオブジェクトをシリアル化しようとするのを防ぐことができますか?


リクエストにより、状況を再現するための最小限の例:

% in TestClass.m
classdef TestClass < handle
    methods
        function sobj = saveobj(self)
            sojb = [];
            error('Unable to store %s objects', class(self));
        end
    end
end

% on the interactive prompt:

>> t = TestClass();

>> save('/tmp/fubar.mat', 't');
Warning: While saving an object of class 'TestClass':
Unable to store TestClass objects 
Warning: While saving an object of class 'TestClass':
Unable to store TestClass objects 
4

2 に答える 2

3

個人的には、すべてのプロパティをとしてマークしTransient、保存/読み込みの結果である無効な状態をオブジェクトに効果的に持たせることを好みます。MATLABによるデータの保存を防ぐことは非常に困難であり、回避策によってユーザーのワークフローが大幅に妨げられる可能性があります。

于 2013-03-18T11:53:16.687 に答える
-1

あなたのコードは実際にエラーをスローします。あなたの呼び出しerror()warning()

于 2013-03-18T11:43:22.877 に答える