1

SuperObject ライブラリには、オブジェクトをシリアル化するための一般的なメソッドがあります。

type
   TSomeObject = class
   ...
   end;

var
   lJSON       : ISuperObject;
   lContext    : TSuperRttiContext;
   lSomeObject : TSomeObject;
begin
   lSomeObject := TSomeObject.Create;
   lContext := TSuperRttiContext.Create;
   lJSON := lContext.AsJson<TSomeObject>(lSomeObject);

しかし今、私はメタクラスのインスタンスを扱っています。
これはオブジェクト構造です:

TJSONStructure = class(TObject);

TReqBase = class(TJSONStructure)
private
   token: Int64;
public
end;

TReqLogin = class(TReqBase)
private
   username,
   password: String;
   module  : Integer;
public
end;


type
   TWebAct = (ttlogin,
              ttsignin);

TReqClass = class of TReqBase;

const
   cWebActStructures: Array[TWebAct] of
   record
      RequestClass : TReqClass;
   end
   = (
      { ttlogin  } (RequestClass: TReqLogin;),
      { ttsignin } (RequestClass: TReqSignIn;)     // Not in definitions above
     ); 

私が今試してみると:

var
   lContext      : TSuperRttiContext;
   lJSON         : ISuperObject;
   lRequestClass : TReqClass;
   lRequestBase  : TReqBase;
begin
   lRequestClass := cWebActStructures[ttlogin].RequestClass;
   lRequestBase := lRequestClass.Create;     // instance of type TReqLogin
   lContext := TSuperRttiContext.Create;
   lJSON := lContext.AsJson<TReqBase>(lRequestBase);

TReqBase をシリアル化します: TReqLoginlJSON.AsString = '{"token":-12346789}'
をシリアル化したいです。
試した:

  • lContext.AsJson< TReqLogin >(lRequestBase); 動作しません: 互換性のないタイプ) [さらに、ルーチンで可能なすべての RequestClass タイプをリスト/処理する必要があります]

  • lContext.AsJson< lRequestBase.ClassType >(lRequestBase) どちらでもない: E2531 メソッド 'AsJson' には明示的な型引数が必要です

lRequestBase を TReqLogin、TReq としてシリアル化する方法はありますか? それらすべてをコーディングする必要はありませんか?

4

1 に答える 1

1

秘訣は、自分で AsJSOn メソッドを作成して呼び出すのではなくTSuperRttiContext、すぐに使用することです。

lJSON := RequestBase.ToJSON;

次に、ToJSON メソッドがバックグラウンドで TSuperRttiContext を作成し、必要な変換を処理します。

Marjanの助けに心から感謝します。

于 2013-08-12T10:06:47.473 に答える