我正在使用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;


//得到杰森

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);


然后在服务器端的get 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);

08-26 00:52