unit Unit1;
interface
uses
System.SysUtils,
XData.Service.Common,
XData.Server.Module,
XData.OpenAPI.Service,
XData.Json.Serializer,
XData.Json.Deserializer;
type
TExpr = class
end;
TIntValueExpr = class(TExpr)
private
FValue: integer;
public
constructor Create(value: integer);
property value: integer read FValue write FValue;
end;
TDoubleValueExpr = class(TExpr)
private
FValue: double;
public
constructor Create(value: double);
property value: double read FValue write FValue;
end;
TUnaryOpExpr = class(TExpr)
private
FOperation: char;
FExpr: TExpr;
public
constructor Create(op: char; expr: TExpr);
property Operation: char read FOperation write FOperation;
property expr: TExpr read FExpr write FExpr;
end;
TBinOpExpr = class(TExpr)
private
FOperation: char;
FLeft: TExpr;
FRight: TExpr;
public
constructor Create(Left: TExpr; op: char; right: TExpr);
property Operation: char read FOperation write FOperation;
property Left: TExpr read FLeft write FLeft;
property right: TExpr read FRight write FRight;
end;
[ServiceContract]
IMyService = interface(IInvokable)
['{8F4A594D-B611-4FE9-8B95-F60D77FCFE29}']
[HttpGet]
function Test(): string;
end;
[ServiceImplementation]
TMyService = class(TInterfacedObject, IMyService)
public
function Test(): string;
end;
implementation
type
TJsonHelper = class
class function ToJson<T>(const value: T): string; static;
class function FromJson<T>(const Json: string): T; static;
end;
function TMyService.Test(): string;
var
expr: TExpr;
begin
expr := TBinOpExpr.Create(TIntValueExpr.Create(1), '+', TUnaryOpExpr.Create('-', TDoubleValueExpr.Create(345.67)));
result := TJsonHelper.ToJson(expr);
writeln('serialised', result);
expr := TJsonHelper.FromJson<TExpr>(result);
result := TJsonHelper.ToJson(expr);
writeln('expecting serialised above: ', result);
end;
constructor TIntValueExpr.Create(value: integer);
begin
FValue := value;
end;
{ TBinOpExpr }
constructor TBinOpExpr.Create(Left: TExpr; op: char; right: TExpr);
begin
FLeft := Left;
FRight := right;
FOperation := op;
end;
{ TUnaryOpExpr }
constructor TUnaryOpExpr.Create(op: char; expr: TExpr);
begin
FOperation := op;
FExpr := expr;
end;
{ TDoubleValueExpr }
constructor TDoubleValueExpr.Create(value: double);
begin
FValue := value;
end;
{ TJsonHelper }
class function TJsonHelper.FromJson<T>(const Json: string): T;
var
Deserializer: TXDataJsonClientDeserializer;
begin
Deserializer := TXDataJsonClientDeserializer.Create(TXDataOperationContext.Current.Handler.XModel, nil);
try
result := Deserializer.Read<T>(json);
finally
Deserializer.free;
end;
end;
class function TJsonHelper.ToJson<T>(const value: T): string;
var
Serializer: TXDataJsonClientSerializer;
begin
Serializer := TXDataJsonClientSerializer.Create(TXDataOperationContext.Current.Handler.XModel);
try
result := Serializer.WriteAs(value);
finally
Serializer.free;
end;
end;
initialization
RegisterServiceType(TMyService);
end.
-----------------------------------------console output------------------------------------------------------------
listening on port 8080
press enter to terminate
serialised{"$id":1,"@xdata.type":"Unit1.TBinOpExpr","Operation":"+","Left":{"$id":2,"@xdata.type":"Unit1.TIntValueExpr","Value":1},"Right":{"$id":3,"@xdata.type":"Unit1.TUnaryOpExpr","Operation":"-","Expr":{"$id":4,"@xdata.type":"Unit1.TDoubleValueExpr","Value":345.67}}}
expecting serialised above: {"$id":1,"@xdata.type":"Unit1.TBinOpExpr","Operation":"+","Left":{"$id":2,"@xdata.type":"Unit1.TIntValueExpr","Value":1},"Right":{"$id":3,"@xdata.type":"Unit1.TUnaryOpExpr","Operation":"-","Expr":{"$id":4,"@xdata.type":"Unit1.TDoubleValueExpr","Value":345.67}}}
----------------------------------------------------------------------------------