Delphi 组件序列化

Posted

技术标签:

【中文标题】Delphi 组件序列化【英文标题】:Delphi Component Serialization 【发布时间】:2010-09-09 14:07:52 【问题描述】:

是否有人遇到过将组件序列化到文件中并将它们读回的问题,特别是在组件供应商升级 VCL 组件的领域。例如,一个文件用 DelphiX 序列化,然后几年后用 delphiY 读回。序列化格式是否发生变化,如果发生变化,可以采取哪些措施来防止升级时读取组件时出错。

【问题讨论】:

【参考方案1】:

用于序列化已发布属性的内置 RTTI 系统容易受到组件更改的影响。只要将旧属性保留在新对象中,就可以管理前进。 IE。您可以保留属性界面,但如果您愿意,可以丢弃内容。倒退更糟 - 因为新版本保存的属性无法在旧版本加载中打开,这将是一个问题。

有一些组件/库 (http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes) 可以添加 XML 格式的序列化,这可能会有所帮助,因为您可以选择跳过您不知道的内容。

您仍然需要注意如何设计已发布的内容,并且可能应该找到一种方法来“忽略但传播”您当前版本不理解的内容。这将允许您以较新的格式打开和更改文件,同时尝试保留较新的属性,而不是剥离它们。

【讨论】:

当您直接使用 Classes.TReader 并为 OnError 事件编写处理程序时,使用 VCL-Streaming 您可以处理缺失的属性(以及缺失的类和其他错误)。您在 Classes 单元中找到了所有需要的代码。最大的缺点是你的类/类必须从 TComponent 或至少从 TPersistent 派生。【参考方案2】:

格式肯定会发生变化,因为供应商将为其组件添加功能。序列化只是循环所有已发布的属性并将它们保存到流中。当它们被读回时,从流中读取的每个属性都将被设置回组件。如果该属性不再存在,那么您就有问题了。除了一些基本的异常处理之外,我认为您对此无能为力。

保证兼容性的最佳方式是进行自己的序列化。

【讨论】:

【参考方案3】:

感谢您的回复。我试图避免自定义序列化并利用每个组件序列化技术,但是由于缺少任何方法来“修补”升级到新组件格式,我猜自定义序列化是唯一的方法。

【讨论】:

您可以使新版本能够读取旧流,只要您仍然具有对旧参数和过时参数的读取支持。问题在于让旧版本读取新流,这在没有自定义序列化的情况下无法完成。

以上是关于Delphi 组件序列化的主要内容,如果未能解决你的问题,请参考以下文章

delphi的对象如何序列化

delphi 对象序列化保存到文件中,反序列化后出现乱码

YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作)

Delphi字典保存/加载。 TDictionary不可序列化?

DELPHI XE2 采用 JSON 的方式来序列化对象

Delphi10.3通过Json.Serializers单元对大量数据序列化