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