Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:将对象流化为XML,包括数组属性_Xml_Delphi_Serialization_Properties_Xml Serialization - Fatal编程技术网

Delphi:将对象流化为XML,包括数组属性

Delphi:将对象流化为XML,包括数组属性,xml,delphi,serialization,properties,xml-serialization,Xml,Delphi,Serialization,Properties,Xml Serialization,我们有一个巨大的数据对象结构,包含许多实际上是数组的属性。现在,我们需要将数据流化为XML文档 为此,我们考虑使用组件来流式处理。它使用的机制与TComponent流媒体使用的机制相同。这工作得相当不错,只是它不流化索引属性 无论如何,是否有办法做到这一点,或者是否有组件能够做到这一点?索引属性不向RTTI公开(并且仍然不在Delphi XE中),并且它们也不由TComponent流式传输 如果您想继续使用TComponent机制(或纯基于RTTI的流式传输),一个选项是使用TCollectio

我们有一个巨大的数据对象结构,包含许多实际上是数组的属性。现在,我们需要将数据流化为XML文档

为此,我们考虑使用组件来流式处理。它使用的机制与TComponent流媒体使用的机制相同。这工作得相当不错,只是它不流化索引属性


无论如何,是否有办法做到这一点,或者是否有组件能够做到这一点?

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

如果您想继续使用TComponent机制(或纯基于RTTI的流式传输),一个选项是使用TCollection,它可以“作为一个阵列”进行流式传输。但是,这对数组施加了严格的限制,即它们的容器必须是TCollection的子类,它们的项必须是TCollectionItem的子类

我不知道NativeXML组件,但如果它们基于TWriter/TReader,则可以使用另一个选项,这允许您定义自己的属性,然后您可以随心所欲地流式传输任何内容。

这涉及流式处理的特殊代码,但如果数组不太具体,您可以将该代码放在类属性中,并在一个根类中处理所有内容。

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

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


无论如何,谢谢你的建议

甚至我的XML序列化引擎也不支持索引属性@罗伯特洛夫:但它支持数组吗?它应该支持,但老实说,我没有测试这个功能。你为什么要序列化索引属性?属性不包含任何数据。它既可以访问字段,也可以使用getter函数计算其值(再次访问某个字段)。因此,您需要考虑的是序列化字段。仅供参考,在XE2中添加了数组属性的RTTI:)
DefineProperties
肯定是一个选项,谢谢;我忘了那个。遗憾的是,将定义的属性转换为二进制流,尽管。。。有点违背了XML的目的。