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 ......而不必为它们编写所有代码?
答案 0 :(得分:1)
诀窍是不创建TSuperRttiContext
并自己调用其AsJSOn方法,但要立即使用:
lJSON := RequestBase.ToJSON;
然后,ToJSON方法将在幕后创建一个TSuperRttiContext并处理必要的转换。
非常感谢Marjan给予她的帮助。