为通过元类实例化的实例序列化JSON对象

时间:2013-08-08 13:35:03

标签: delphi generics delphi-xe2 superobject

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序列化:lJSON.AsString = '{"token":-12346789}'
我想将TReqLogin序列化 尝试:

  • lContext.AsJson&LT; TReqLogin&gt;(lRequestBase);不起作用:不兼容的类型)[此外,我必须在我的例行程序中列出/处理所有可能的RequestClass类型]

  • lContext.AsJson&LT; lRequestBase.ClassType&gt;(lRequestBase):E2531方法'AsJson'需要显式类型参数

有什么方法可以将我的lRequestBase序列化为TReqLogin,TReq ......而不必为它们编写所有代码?

1 个答案:

答案 0 :(得分:1)

诀窍是创建TSuperRttiContext并自己调用其AsJSOn方法,但要立即使用:

lJSON := RequestBase.ToJSON;

然后,ToJSON方法将在幕后创建一个TSuperRttiContext并处理必要的转换。

非常感谢Marjan给予她的帮助。