TFDJSONDataSetsを引数に持つDataSnapのサーバーメソッドを呼び出した場合、EZCompressionError('Invalid ZStream operation!')例外エラーが発生することがある
対象となる製品
- RAD Studio 11.0 Alexandria
- C++Builder 11.0 Alexandria
- Delphi 11.0 Alexandria
問題
TFDJSONDataSetsを引数に持つDataSnapのサーバーメソッドを呼び出した場合、例外エラーが発生することがあります。
以下は、そのサンプルコードの例です。
DataSnapサーバーの実装コードの例:
type
TServerMethods1 = class(TDataModule)
private
{ private 宣言 }
public
{ public 宣言 }
function TestProc(param: TFDJSONDataSets): boolean;
end;
..
..
function TServerMethods1.TestProc(param: TFDJSONDataSets): boolean;
begin
..
..
end;
DataSnapクライアントの実装コード:
var
Client: TServerMethods1Client;
FDMemTable : TFDMemTable;
DataSetList : TFDJSonDataSets;
begin
Client:= TServerMethods1Client.Create(ClientModule1.DSRestConnection1);
..
..
DataSetList := TFDJSONDataSets.Create;
TFDJSONDataSetsWriter.ListAdd(DataSetList, FDMemTable);
Client.TestProc(DataSetList);
..
..
end;
DataSnapサーバーを起動し、DataSnapクライアントからサーバーメソッド(TestProc)へアクセスすると、以下のエラーが発生します。
例外クラスは EZCompressionError メッセージは 'Invalid ZStream operation!'
解決
本症状は、RAD Studio 11.0固有の不具合で、次のアップデートであるRAD Studio 11.1で修正予定です。
この問題を解決したい場合は、C:\Program Files (x86)\Embarcadero\Studio\22.0\source\rtl\common\System.ZLib.pasを自身のプロジェクトフォルダへコピーし、TZCompressionStream.Seekメソッドを以下のように修正してください。
System.ZLib.pas
修正前:
function TZCompressionStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
if (offset = 0) and (origin = soCurrent) then
begin
result := FZStream.total_in;
end
else raise EZCompressionError.Create(SZInvalid);
end;
修正後:
function TZCompressionStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
procedure Error;
begin
raise EZCompressionError.Create(SZInvalid);
end;
begin
case Origin of
soBeginning:
if FZStream.total_in <> Offset then
Error;
soCurrent, soEnd:
if Offset <> 0 then
Error;
end;
result := FZStream.total_in;
end;
修正したSystem.ZLib.pasの適用方法は、以下のドキュメントを参照してください。