将多个对象流式传输到TMemoryStream

时间:2010-05-25 11:54:26

标签: delphi delphi-7

我需要将多个对象(大多数是TObject /非持久性)存储到TMemoryStream,将流保存到磁盘并加载回来。对象需要一个接一个地流式传输。某种通用容器。

目前,我将对象的所有属性/字段/变量放入记录中,并将记录保存到流中。但我打算使用函数文件WriteIntergerWriteString(见下文),WriteBoolean等函数来保存/加载来自流的数据。

StreamReadString(CONST MemStream: TMemoryStream): string; 
StreamWriteString(CONST MemStream: TMemoryStream; s: string);

然而,似乎我需要重写很多代码。其中一个例子是TStringList.LoadFromStream,它不起作用,因此需要重写。这是因为TStringList需要是流中的最后一个对象(它从当前位置读取到流的末尾)。

有人知道提供这样的基本功能的库吗?


我正在使用Delphi 7,因此RTTI不是很好。

4 个答案:

答案 0 :(得分:1)

哪个Delphi版本? Delphi 2010具有新的RTTI功能,因此您可以使用DeHL,其中包含“所有包含的类型和集合的完全通用序列化”。

答案 1 :(得分:1)

为什么不使用XML?

  1. 为定义XML的XML编写XSD。
  2. 使用XML数据绑定向导生成一个包含XSD的Delphi单元格。
  3. 将一堆对象放入该XML中。
  4. 将XML保存到磁盘(或将其流式传输到其他媒体)。
  5. 有关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调用!)。

相关问题