作为自动持久性的替代方案(因为 RTTI 在最新的修补程序中不起作用,并且您选择不使用 RTTI 进行对象映射),应该提到 Smart Pascal 支持 JavaScript 结构。这将大大简化对象存储。如果您曾经使用过 Microsoft 属性包(com 类),那么这或多或少是一回事。
在 JavaScript 中,你会写:
var mbag = {};
mbag["test"] = {};
mbag["test"]["somevalue"] = 12;
mBag["text"] = "this is a string value";
导致这样的内存结构:
Type
TMyBagContent = Record
bcTest = Record
bcSomeValue:Integer;
end;
bcText:String;
End;
在 Delphi 中,这种结构是在 SuperObject 中实现的(我相信)。RemObjects 也有一些模仿这个的支持类。但值得庆幸的是,Smart Pascal 通过直接针对 JavaScript 的优雅自动实现了这一点。
因此,在 Smart Pascal 中,您将执行以下操作来获得相同的结果:
var mBag:Variant;
mBag:=TVariant.CreateObject;
mBag['test'] := TVariant.CreateObject;
mBag['test']['somevalue']:=12;
mBag['text']:='this is a string';
您还可以节省一些时间并使用装配部分:
var mBag:variant;
asm
@mbag = {};
@mbag["test"] = {};
@mbag["test"]["somevalue"] = 12;
@mbag["text"] = "this is a string value";
end;
一旦填充了对象的数据,就可以使用 JSON 进行序列化并使其可移植:
var mObj: String;
asm
@mObj = JSON.stringify(@mbag);
end;
为存储创建读/写类非常容易。自然自动的 RTTI 属性映射更好(并且应该很快修复),但是对于手动执行它的框架 - 这确实比完全自动化有一些优势 - 对于像你这样的创造性程序员来说,有很多选择。
还需要考虑速度,并且与 for/next 递归算法相比,使用 JavaScript 对象作为查找表非常非常快。特别是对于大型和复杂的数据结构。
期待测试您的创作:)