将对象传递给 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);
我正在使用 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);