问题描述
我有DataSnap Server,并且我有一些服务器方法来设置和获取带有变量字段的对象
这是我可以通过DataSnap访问的对象的n个示例:
type
TOrder = class
private
[JSONReflect(ctObject,rtObject,TSampleVariantInterceptor,nil,true)]
FComment: Variant;
[JSONReflect(ctObject,true)]
FNumber: Variant;
procedure SetComment(const Value: Variant);
procedure SetNumber(const Value: Variant);
public
property Number: Variant read FNumber write SetNumber;
property Comment: Variant read FComment write SetComment;
end;
implementation
{ TOrder }
procedure TOrder.SetComment(const Value: Variant);
begin
FComment := Value;
end;
procedure TOrder.SetNumber(const Value: Variant);
begin
FNumber := Value;
end;
这是我的ServerMethod示例代码:
TsmOrder = class(TDSServerModule)
public
...
function Getorder(const AID: Integer): TOrder;
function Setorder(const AOrder: TOrder): Integer;
end;
这是我的TSampleVariantInterceptor定义位置的单位
unit MarshallingUtils;
interface
uses SysUtils,Classes,DBXJSON,StrUtils,RTTI,DBXJSONReflect,Variants;
type
TSampleVariantInterceptor = class(TJSONInterceptor)
private
public
function ObjectConverter(Data: TObject; Field: String): TObject; override;
procedure ObjectReverter(Data: TObject; Field: String; Arg: TObject); override;
end;
[JSONReflect(true)]
TReflectvariantObject = class
private
FType: tvarType;
FValue: string;
public
constructor Create(ASampleVariant: Variant);
function Getvariant: Variant;
end;
implementation
const
NullVariantString = 'null';
{ TSampleVariantInterceptor }
function TSampleVariantInterceptor.ObjectConverter(Data: TObject;
Field: String): TObject;
var
LRttiContext: TRttiContext;
LVariant: Variant;
begin
LVariant := LRttiContext.GetType(Data.Classtype).GetField(Field).GetValue(Data).AsType<Variant>;
Result := TReflectvariantObject.Create(LVariant);
end;
procedure TSampleVariantInterceptor.ObjectReverter(Data: TObject; Field: String;
Arg: TObject);
var
LRttiContext: TRttiContext;
LRttiField: TRttiField;
LVariant: Variant;
begin
Assert(Arg is TReflectvariantObject);
LVariant := TReflectvariantObject(Arg).Getvariant;
LRttiField := LRttiContext.GetType(Data.Classtype).GetField(Field);
LRttiField.SetValue(Data,TValue.FromVariant(LVariant));
Arg.Free;
end;
{ TReflectvariantObject }
constructor TReflectvariantObject.Create(ASampleVariant: Variant);
begin
FType := VarType(ASampleVariant);
case FType of
varNull: FValue := NullVariantString;
else
FValue := ASampleVariant; // Convert to string
end;
end;
function TReflectvariantObject.Getvariant: Variant;
var
V: Variant;
begin
if FValue = NullVariantString then
V := Null
else
V := FValue;
VarCast(Result,V,FType);
end;
end.
我的变量在服务器中得到了很好的转换:我在提琴手中看不到空字符串,但是在我的客户端应用程序中,我的变量显示为Empty,而不是Null Variant。我做错什么了吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)