/ / Kann ich eine datasnap-Servermethode mit Array-Parametern deklarieren? - Json, Delphi, Datennap

Kann ich eine DataSnap-Server-Methode mit Array-Parametern deklarieren? - JSON, Delphi, Datasnap

Parameter von Servermethoden in datasnap unterstützen eine Reihe von Datentypen. TArray<string> oder array of string soll Grundtyp sein, aber das Folgende Test Methode funktioniert nicht:

type{$M+}
TMyModule = class(TDSServerModule)
public
function ReverseString(Value: string): string;
function Test: TArray<string>;
end;

Gibt es einen alternativen Weg, um Array-Methoden mit Servermethoden arbeiten zu lassen?

Antworten:

0 für die Antwort № 1

Ja da ist. Sie müssen lediglich Ihr Array in ein Objekt einkapseln. Hier ist ein Beispiel für ein Array von ganzen Zahlen:

` Einheit TransferObjects;

interface

type
TIntArray = TArray<Integer>;

TIntegerArray = class(TObject)
private
FValues: TIntArray;
function GetValues: TIntArray;
procedure SetValues(const Value: TIntArray);
public
property Values : TIntArray read GetValues write SetValues;
constructor Create;
function Length : Integer;
procedure Resize(Count : Integer);
end;

implementation

{ TIntegerArray }

constructor TIntegerArray.Create;
begin
inherited create;
Resize(0);
end;

function TIntegerArray.GetValues: TIntArray;
begin
Result := FValues;
end;

function TIntegerArray.Length: Integer;
begin
Result := System.Length(FValues);
end;

procedure TIntegerArray.Resize(Count : Integer);
begin
SetLength(FValues, Count);
end;

procedure TIntegerArray.SetValues(const Value: TIntArray);
begin
FValues := Value;
end;

end.

unit ServerMethodsUnit1;

interface

uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth,
TransferObjects;

type
{$METHODINFO ON}
TServerMethods1 = class(TComponent)
private
{ Private declarations }
public
{ Public declarations }
function ReverseArray(Value : TIntegerArray) : TIntegerArray;
end;
{$METHODINFO OFF}

implementation


function TServerMethods1.ReverseArray(Value: TIntegerArray): TIntegerArray;
var
i, l : Integer;
Erg : TIntegerArray;
begin
Erg := TIntegerArray.Create;
Erg.Resize(Value.Length);
for i := 0 to Value.Length-1 do
begin
l := Value.Length-1-i;
Erg.Values[l] := Value.Values[i];
end;
Result := Erg;
end;
end.

`

Das ist vielleicht nicht sehr elegant, aber es funktioniert (getestet mit XE6). So kann das Objekt intern mit JSON gemarshallt werden, derselbe Code, der Schnittstellen verwendet, funktioniert jedoch nicht.

h