【问题标题】:Delphi: stream objects to XML, including array propertiesDelphi:将对象流式传输到 XML,包括数组属性
【发布时间】:2011-02-08 15:26:05
【问题描述】:

我们有一个庞大的数据对象结构,其中包含许多实际上是数组的属性。现在,我们需要将数据流式传输到 XML 文档。

为此,我们考虑使用NativeXML 组件进行流式传输。它使用与 TComponent 流式传输相同的机制。这工作得相当好,只是它不会流式传输索引属性。

有没有办法做到这一点,或者有没有能够做到这一点的组件?

【问题讨论】:

  • 甚至我的 XML 序列化引擎也不支持索引属性。 code.google.com/p/robstechcorner/source/browse/trunk/Delphi/…
  • @RobertLove:它支持数组吗?
  • 应该,但老实说我没有测试过这个功能。
  • 为什么要序列化索引属性?属性不保存任何数据。它要么访问一个字段,要么具有一个计算其值的 getter 函数(再次访问某个字段)。所以恕我直言,您所要考虑的就是序列化字段。
  • 仅供参考 - XE2 中添加了数组属性的 RTTI :)

标签: xml delphi serialization properties xml-serialization


【解决方案1】:

索引属性不向 RTTI 公开(并且仍然不在 Delphi XE 中),它们也不由 TComponent 流式传输。

如果您想继续使用 TComponent 机制(或纯基于 RTTI 的流式传输),一种选择是使用 TCollection,它确实会“作为数组”流式传输。但是,这对您的数组施加了严格的限制,即。它们的容器必须是 TCollection 的子类,并且它们的项目必须是 TCollectionItem 的子类。

我不知道 NativeXML 组件,但如果它们基于 TWriter/TReader,另一种选择是使用 DefineProperties,这允许您定义自己的属性,然后您可以流式传输任何您想要的内容,随心所欲。
这涉及用于流式传输的特殊代码,但如果您的数组不是太具体,您可以将该代码放在类属性中,并在您的根类之一中处理所有内容。

【讨论】:

  • DefineProperties 绝对是一个选择,谢谢;我忘记了那个。将定义的属性转换为二进制流是一种耻辱,不过……有点违背了 XML 的目的。
【解决方案2】:

最后,我们创建了一些额外的类(继承自TPersistent)来存储数组属性;原来只有一组有限的数组类型。事实证明,Delphi 的索引属性非常有用:我们可以只指定一个 getter 函数,并将数组的大多数固定元素定义为引用该 getter 和索引的单独属性。这些属性现在被序列化为适当的 XML 元素,并具有适当的名称。

不过,向所有使用它们的类添加构造函数和析构函数需要几个小时。

不管怎样,谢谢大家的建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多