将对象传递给 DataSnap 服务器方法?

Passing Objects to DataSnap Server Methods?

我正在使用 Delphi XE6 和 datasnap,我正在尝试将带有某些字段的对象 (TDataObj) 传递给 datasnap 服务器方法,但出现了最奇怪的错误。如果我传入的数据对象不是 nil,我的服务器方法将在创建 TStringStream 时崩溃。

//客户端

procedure TForm8.btnGetDataClick(Sender: TObject);
var
  DataObj: TDataObj;
  S: TStream;
begin
  //create an object
  DataObj := TDataObj.Create;
  DataObj.Id:= 1;
  DataObj.Name := 'DataObj1';
  DataObj.ExportType := 'PDF';
  //pass the obj to server method to retrieve data stream back
  try
    S := ClientModule1.ServerMethods1Client.GetData(DataObj);
    S.Seek(0, soFromBeginning);
    ClientDataSet1.LoadFromStream(S);
    ClientDataSet1.Open;
  finally
  end;
end;

//服务器端方法

function TServerMethods1.getData(const DataObj: TDataObj): TStream;
var
  r: String;
  SS: TStringStream;
begin
  //create a stream using JSON from getSessionJSON method
  SS := TStringStream.Create(getSessionJSON(DataObj)); //returns json
  try
    try
      r := ServerContainer1.idHttp1.Post
        ('MyUrlHere', SS);
      //do something else here
    except
      on e: exception do
      begin
        ShowMessage(e.Message);
        exit;
      end;
    end;
  finally
    SS.Free;
  end; 
end;

//得到Json

function TServerMethods1.getSessionJSON(const DataObj: TDataObj): String;
var
  ParamsJSONObj, SessionJSONObj: TJSONObject;
begin
  ParamsJSONObj := TJSONObject.Create;
  ParamsJSONObj.AddPair(TJSONPair.Create('ID', DataObj.Id));
  ParamsJSONObj.AddPair(TJSONPair.Create('Name', DataObj.Name));
  ParamsJSONObj.AddPair(TJSONPair.Create('ExportType', DataObj.ExportType));
  SessionJSONObj := TJSONObject.Create;
  SessionJSONObj.AddPair(TJSONPair.Create('DataParams', ParamsJSONObj));
  result := SessionJSONObj.toString;
end;

但是,在客户端,如果我传入一个 nil 对象

 S := ClientModule1.ServerMethods1Client.GetData(nil);

然后在服务器端Json中填入值

 ParamsJSONObj.AddPair(TJSONPair.Create('ID', '1'));
  ParamsJSONObj.AddPair(TJSONPair.Create('Name', 'DataObj1'));
  ParamsJSONObj.AddPair(TJSONPair.Create('ExportType', 'pdf'));

它有效,但是,如果我传入实际数据对象 (dataObj) 而不是 nil

它在服务器端崩溃

  SS := TStringStream.Create(getSessionJSON(DataObj)); 

是否调用getSessionJSON

如果我放在任何字符串中

SS := TStringStream.Create('THis is a random test');

如果 DataObj 不为 nil,则 dataObj 中的值存在,但

SS := TStringStream.Create 会抛出运行时错误

希望这是可以理解的? dataObj,如果 dataObj 不是 nil

,则上面的调用会崩溃

如有任何帮助,我们将不胜感激

原来是一个编码问题,已使用

解决
 S := getSessionJSON(DataObj);
  SS := TStringStream.Create(r, TEncoding.ASCII);