2008-09-16 91 views
6

有没有人遇到过问题,将组件序列化成文件并读回来,特别是在组件供应商升级VCL组件的区域。例如一个用DelphiX序列化的文件,然后几年后用delphiY回读。序列化格式是否改变,如果有的话,可以做些什么来防止升级时组件中的错误读取。Delphi组件序列化

回答

3

用于序列化已发布属性的内置RTTI系统易受组件更改影响。只要旧物业保存在新物品中,前行就可以管理。即你可以按照原样离开财产界面,但如果你愿意的话,可以抛弃内容。向后退却更糟糕 - 由于新版本保存的属性无法在旧版本加载中打开,这将是一个问题。

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

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

+0

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

0

由于供应商会向其组件添加功能,因此格式将明确更改。序列化只是遍历所有已发布的属性并将它们保存到流中。当它们被读回时,从流中读取的每个属性都将被设置回组件。如果该物业不存在了,你有问题。除了一些基本的异常处理外,我不认为你可以做任何事情。

保证兼容性的最佳方法是自己做系列化。

0

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

+0

只要您仍然阅读支持旧的和过时的参数,就可以使新版本能够读取旧的流。问题在于让旧发行版读取新的流,而这些新流是没有定制序列化的情况下无法完成的。 – 2008-09-17 06:46:45