【问题标题】:Streaming multiple TObjects to a TMemoryStream将多个 TObject 流式传输到 TMemoryStream
【发布时间】:2010-05-25 11:54:26
【问题描述】:

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

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

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

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

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


我使用的是 Delphi 7,所以 RTTI 不是很好。

【问题讨论】:

    标签: delphi delphi-7


    【解决方案1】:

    查看相关帖子here

    顺便说一句,Delphi7 也支持 RTTI,否则无法加载您的表单 (.dfm) :-)
    如果您使用已发布的属性,RTTI 将为您“开箱即用”。
    否则你必须自己做一个

    procedure DefineProperties(Filer: TFiler); override;

    你可以看看它是如何实现的:

    procedure TDataModule.DefineProperties(Filer: TFiler);
    

    这些是对象序列化的唯一方法。
    但是您也可以尝试记录:如果您不使用数组(字符串也是 char 数组)或对象属性,您可以直接将记录保存并加载到内存(流、文件等)。我在我的AsmProfiler 中使用它,以便能够非常快速地读取和写入许多(小)结果(带有一些整数值的记录数组可以通过一次 Move/CopyMemory 调用保存和加载!)。

    【讨论】:

    • 目前我将一个对象的所有属性/字段/变量放入一个记录并将记录保存到流中。但我打算使用我的“WriteInterger”、“WriteString”、“WriteBoolean”等函数来保存/加载流中的数据。
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    您是否考虑过使用 TReader 和 TWriter 来填充您的流。

    【讨论】:

      【解决方案4】:

      为什么不使用 XML?

      1. 为定义 XML 的 XML 编写 XSD。
      2. 使用 XML 数据绑定向导生成 XSD 的 Delphi 单元表单。
      3. 将一堆对象放入该 XML 中。
      4. 将 XML 保存到磁盘(或将其流式传输到其他介质)。

      有关 XML 和 XML 数据绑定向导的更多信息,请参阅this answer

      编辑:

      只需将您的对象映射到从 XSD 生成的接口/对象;或者使用已经生成的对象/接口。

      这通常比挂钩到 Delphi 流机制要容易得多(通过在对象周围编写具有已发布属性的 TPersistent 包装器,采用 DefineBinaryProperty 方式或 TReader/TWriter/DefineProperty 方式)。

      --杰罗恩

      【讨论】:

      • 此 XML 是否适用于非发布属性和非持久类(如 TObject)?我还担心生成的文件的大小可能比二进制文件大几倍。
      猜你喜欢
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多