将多个 TObject 流式传输到 TMemoryStream

Posted

技术标签:

【中文标题】将多个 TObject 流式传输到 TMemoryStream【英文标题】:Streaming multiple TObjects to a 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 不是很好。

【问题讨论】:

【参考方案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,它具有“所有包含的类型和集合的完整通用序列化”。

【讨论】:

对不起。我忘了添加:Delphi 7。 好的,那你可以试试“opensource.hitsoft-it.com/display/HitXMLe/General+Description”(我们在D2007中使用它来序列化为xml)【参考方案3】:

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

【讨论】:

【参考方案4】:

为什么不使用 XML?

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

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

编辑:

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

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

--杰罗恩

【讨论】:

此 XML 是否适用于非发布属性和非持久类(如 TObject)?我还担心生成的文件的大小可能比二进制文件大几倍。

以上是关于将多个 TObject 流式传输到 TMemoryStream的主要内容,如果未能解决你的问题,请参考以下文章

将音频流式传输到多个 AirPlay 设备

将多个 mp3 文件流式传输到 Icecast

Socket.io 没有流式传输到多个连接

是否可能:使用多个线程将输出流式传输到不同的文件/

使用promises将多个svg字符串流式传输到nodejs中的png

Java - 将 JMS 消息流式传输到 Oracle 表中