2011年10月15日星期六

datasnap的初步 直接返会自定义类

前面我说datasnap不支持自定义类型是错误的。其实datasnap一旦发现是自定义类型,就会自动用json给marshall了,今天的测试代码如下。

服务器端
function TServerMethods1.GetPerson: TPerson;
begin
  Result := TPerson.Create;
  Result.FirstName := 'zyz';
  Result.LastName := 'Jacky';
  Result.Age := 21;
end;
客户端,让SQLConnection自动产生代理代码,可以的到
function TServerMethods1Client.GetPerson: TPerson;
begin
  if FGetPersonCommand = nil then
  begin
    FGetPersonCommand := FDBXConnection.CreateCommand;
    FGetPersonCommand.CommandType := TDBXCommandTypes.DSServerMethod;
    FGetPersonCommand.Text := 'TServerMethods1.GetPerson';
    FGetPersonCommand.Prepare;
  end;
  FGetPersonCommand.ExecuteUpdate;
  if not FGetPersonCommand.Parameters[0].Value.IsNull then
  begin
    FUnMarshal := TDBXClientCommand(FGetPersonCommand.Parameters[0].ConnectionHandler).GetJSONUnMarshaler;
    try
      Result := TPerson(FUnMarshal.UnMarshal(FGetPersonCommand.Parameters[0].Value.GetJSONValue(True)));
      if FInstanceOwner then
        FGetPersonCommand.FreeOnExecute(Result);
    finally
      FreeAndNil(FUnMarshal)
    end
  end
  else
    Result := nil;
end;

也就是说,客户端也会自动给unmarshal的。
调用代码
procedure TForm1.btn3Click(Sender: TObject);
var
  p: TPerson;
begin
  p := FServerMethod.GetPerson;
  with p do
  ShowMessage(Format('FirstName=%s, LastName=%s, Age=%d',
      [FirstName, LastName, Age]));
  //p.Free;
end;

由于我的FInstanceOwner使用的默认为true,UnMarshal的CreateObject产生的类,让Datasnap自己去释放了,所以p.free要注视掉。释放的时机有两个:
1。下一次调用到来
2。DBXCommand.Close


没有评论:

发表评论