2011年10月12日星期三

datasnap的初步 返回自定义的类数组

虽然datasnap不能直接传递自定义类,但是Marshal一下就可以了。写了个测试代码,返回自定义的类的数组。

上代码。
unit uPerson;

interface

uses
  Data.DBXJSONReflect, Data.DBXJSON, System.SysUtils;

type
  TPerson = class
    FirstName: string;
    LastName: string;
    Age: Integer;
  end;
  TPersonArray = array of TPerson;

function JSONMarshal(persons: TPersonArray): TJSONArray;
function JSONUnMarshal(persons: TJSONArray): TPersonArray;

implementation

function JSONMarshal(persons: TPersonArray): TJSONArray;
var
  i: Integer;
  mar: TJSONMarshal;
  jsonPerson: TJSONObject;
begin
  Result := TJSONArray.Create;
  mar := TJSONMarshal.Create(TJSONConverter.Create);
  for i := Low(persons) to High(persons) do
  begin
    jsonPerson := mar.Marshal(persons[i]) as TJSONObject;
    Result.AddElement(jsonPerson);
  end;
  FreeAndNil(mar);
end;

function JSONUnMarshal(persons: TJSONArray): TPersonArray;
var
  i: Integer;
  unmar: TJSONUnMarshal;
  person: TPerson;
begin
  SetLength(Result, persons.Size);
  unmar := TJSONUnMarshal.Create;
  for i := 0 to persons.Size - 1 do
  begin
    person := unmar.Unmarshal(persons.Get(i)) as TPerson;
    Result[i] := person;
  end;
  FreeAndNil(unmar);
end;

end.


服务器端代码
function TServerMethods1.GetPersons: TJSONArray;
var
  i: Integer;
  persons: TPersonArray;
begin
  SetLength(persons, 3);
  for i := Low(persons) to High(persons) do
  begin
    persons[i] := TPerson.Create;
    with persons[i] do
    begin
      FirstName := 'zzz' + Chr(Ord('A') + Random(20));
      LastName := 'yyy' + Chr(Ord('a') + Random(20));
      Age := Random(80);
    end;
  end;
  Result := JSONMarshal(persons);
  for i := Low(persons) to High(persons) do
    persons[i].Free;
end;

客户端代码
procedure TForm1.btn1Click(Sender: TObject);
var
  persons: TPersonArray;
  i: Integer;
begin
  persons := JSONUnMarshal(FServerMethod.GetPersons);
  mmo1.Clear;
  for i := Low(persons) to High(persons) do
  with persons[i] do
  begin
    mmo1.Lines.Add(Format('FirstName=%s, LastName=%s, Age=%d',
      [FirstName, LastName, Age]));
    Free;
  end;
end;


没有评论:

发表评论