シリアル化と逆シリアル化の実装が面倒で、必要ない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