我需要将多个对象(大多数是TObject
/非持久性)存储到TMemoryStream
,将流保存到磁盘并加载回来。对象需要一个接一个地流式传输。某种通用容器。
目前,我将对象的所有属性/字段/变量放入记录中,并将记录保存到流中。但我打算使用函数文件WriteInterger
,WriteString
(见下文),WriteBoolean
等函数来保存/加载来自流的数据。
StreamReadString(CONST MemStream: TMemoryStream): string;
StreamWriteString(CONST MemStream: TMemoryStream; s: string);
然而,似乎我需要重写很多代码。其中一个例子是TStringList.LoadFromStream
,它不起作用,因此需要重写。这是因为TStringList
需要是流中的最后一个对象(它从当前位置读取到流的末尾)。
有人知道提供这样的基本功能的库吗?
我正在使用Delphi 7,因此RTTI不是很好。
答案 0 :(得分:1)
哪个Delphi版本? Delphi 2010具有新的RTTI功能,因此您可以使用DeHL,其中包含“所有包含的类型和集合的完全通用序列化”。
答案 1 :(得分:1)
为什么不使用XML?
有关XML和XML数据绑定向导的更多信息,请参阅this answer。
编辑:
只需将对象映射到从XSD生成的接口/对象;或使用已生成的对象/接口。
这通常比连接到Delphi流机制要容易得多(通过编写TPersistent包装器,包含对象周围的已发布属性,以DefineBinaryProperty方式或TReader/TWriter/DefineProperty方式)。
- 的Jeroen
答案 2 :(得分:1)
您是否考虑过使用TReader和TWriter来填充您的流。
答案 3 :(得分:1)
参见相关帖子here
顺便说一下,Delphi7也有RTTI支持,否则你的表格(.dfm)无法加载:-)
如果您使用已发布的属性,RTTI将“开箱即用”。
否则你必须自己做一个
procedure DefineProperties(Filer: TFiler); override;
您可以查看它是如何实现的:
procedure TDataModule.DefineProperties(Filer: TFiler);
这些是对象序列化的唯一方法。
但您也可以尝试记录:如果您不使用数组(字符串也是char数组)或对象属性,您可以直接保存并将记录加载到内存(流,文件等)。我在AsmProfiler中使用它能够非常快速地读取和写入许多(小)结果(带有一些整数值的记录数组可以保存并加载一个Move / CopyMemory调用!)。