将多个 TObject 流式传输到 TMemoryStream
Posted
技术标签:
【中文标题】将多个 TObject 流式传输到 TMemoryStream【英文标题】:Streaming multiple TObjects to a TMemoryStream 【发布时间】:2010-05-25 11:54:26 【问题描述】:我需要将多个对象(其中大部分是TObject
/非持久性)存储到TMemoryStream
,将流保存到磁盘并重新加载。对象需要一个接一个地流式传输。某种通用容器。
目前我将对象的所有属性/字段/变量放入记录中并将记录保存到流中。但我打算使用函数文件WriteInterger
、WriteString
(见下文)、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的主要内容,如果未能解决你的问题,请参考以下文章