TFDJSONDataSetsを引数に持つDataSnapのサーバーメソッドを呼び出した場合、EZCompressionError('Invalid ZStream operation!')例外エラーが発生することがある

提供: Support
移動先: 案内検索

対象となる製品

  • 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の適用方法は、以下のドキュメントを参照してください。