2011-02-08 21 views
3

実際に配列である多くのプロパティを含む膨大なデータオブジェクト構造があります。さて、データをXML文書にストリームする必要があります。Delphi:配列オブジェクトのプロパティを含むオブジェクトのXMLへのストリーム

このため、私たちはストリームにNativeXMLコンポーネントを使用すると考えました。 TComponentストリーミングでも使用されているのと同じメカニズムを使用します。これは、インデックス付きのプロパティをストリームしないことを除いて、かなりうまく動作します。

とにかくこれを行う方法はありますか、これを行うことができるコンポーネントがありますか?

+1

私のXMLシリアル化エンジンでさえインデックスプロパティをサポートしていません。 http://code.google.com/p/robstechcorner/source/browse/trunk/Delphi/rtti/xmlserial.pas –

+0

@RobertLove:配列をサポートしていますか? – Martijn

+0

それはすべきですが、私は正直言ってその機能をテストしませんでした。 –

答えて

0

最終的には、配列プロパティの格納用にいくつかの追加クラス(TPersistentを継承)を作成していました。限られた種類の配列しか存在しないことが判明しました。 Delphiのインデックス付きプロパティは本当に便利であることが判明しました.1つのgetter関数を指定するだけで、配列のほとんどの固定要素を1つのゲッターとインデックスを参照する個別のプロパティとして定義できます。これらのプロパティは、適切なXML要素として適切な名前でシリアル化されます。

コンストラクタとデストラクタを使用するすべてのクラスにコンストラクタとデストラクタを追加するのには、少し時間がかかりました。

とにかく、ありがとうございました!

3

インデックス付きのプロパティはRTTIには公開されていません(まだDelphi XEではありません)。また、TComponentによってストリームされません。

TComponentメカニズム(または純粋なRTTIベースのストリーミング)を利用したい場合は、TCollectionを使用して、ストリームとして「配列として」取得することもできます。しかし、それはあなたの配列に厳しい制約を課します。そのコンテナはTCollectionのサブクラスでなければならず、その項目はTCollectionItemのサブクラスでなければなりません。

しかし、私はNativeXMLコンポーネントを知らないが、彼らはTWriter /踏む​​に基づいている場合、別のオプションはDefinePropertiesを使用することができ、これはあなたがあなた自身のプロパティを定義することができます、あなたは、あなたが望むものは何でもストリーミングすることができますあなたは欲しい。
これにはストリーミング用の特別なコードが含まれますが、配列があまり具体的でない場合は、そのコードをクラス属性に配置して、ルートクラスのいずれかのすべてを処理できます。

+0

'DefineProperties'は間違いなくオプションです。私はそのことを忘れてしまった。定義されたプロパティをバイナリストリームに変換することは残念ですが... KindaはXMLの目的を破っています。 – Martijn

関連する問題