Delphi DataSnap TJSONInterceptor for Variant无法正确还原

我有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。我做错什么了吗?

jinhuluntai 回答:Delphi DataSnap TJSONInterceptor for Variant无法正确还原

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1464497.html

大家都在问