2009-07-09 4 views
2

考え方は次のとおりです。 XmlEncoderは、シリアライズされたBeanの再現に必要な操作を何も記録しません。しかし、もし何もないから始めるのではないでしょうか?XmlEncoderを使用してデルタ/差分xmlを作成する

オブジェクトを別のオブジェクトに変換するために必要な操作を記録するためにXmlEncoderを使用できますか?そして、この変換を行うためにXmlDecoderを使用できますか?

2つのオブジェクトの違いを記述したxmlを作成し、このxmlデータを使用してオブジェクトを変換する方法はありますか?

+0

興味深い概念。簡単な例がありますか? – skaffman

答えて

0

javabeans.dtdに基づいてxmlを生成すると、XmlDecoderはxmlからオブジェクトを変換できます。 javabenas.dtdはXmlEncoderスキーマです。 XmlEncoderがオブジェクトをxmlにエンコードする方法について説明するURLを囲んでいます。

私はそれが役に立ちそうです。 :)

虎。

0

XMLDecoderはXMLEncoderとはまったく反対ですが、オブジェクトで始まりXMLにデコードすると、XMLEncoderをオブジェクトに再度変換したように使用できます。

1

それ自体では、XMLEncoderとXMLDecoderは、2つのオブジェクト間のXMLの違いをマッピングし、1つのオブジェクトを別のオブジェクトに変換するために使用することはできません。

しかし、2つのオブジェクトのタイプが同じ場合は、好きなように動作させるためにいくつかの魔法を働かせることができます。私はどうなるのか

A)は、プロパティ名/ propertyValuesのペアを保持しているオブジェクトを作成します。このクラスは、オブジェクト間の相違を保持するために使用されます。単純なMap(String、Object)でも十分です。私はこのABDifferenceを例と呼んでいます。

B)イントロスペクションでオブジェクトAとオブジェクトBを分析し、AとBで異なるBの値を保持するプロパティ名と値を保持するABDifferenceクラスを作成するユーティリティメソッドを作成します。 Introspector.getBeanInfoを使用して、propertyDescriptorを取得し、それらを使用してゲッターを呼び出し、equalsを使用してプロパティ値をチェックします。

例:

OBJECT A(名称: "ピッポ"、説明: "ピッポのバージョンA"、年齢:25)

オブジェクトB(名称: "ピッポ"、説明:「バージョンBピッポの」年齢、:)27

ABDIFFERENCE(地図:説明---> "ピッポのバージョンB"、年齢---> 27)

C)は、このクラスのこのオブジェクトをエンコードし保持しますXMLEncoderを使用している2つの元のオブジェクト間の「相違」。この方法では、オブジェクト全体ではなく、AからBまで異なるプロパティ値を保持する単純なXMLエンコーディングを取得します。

D)ABDifferenceをチェックして、AをBに変換するユーティリティメソッドを実行します。マップのキー/値のペアをループし、そのプロパティのセッターを呼び出すためにリフレクションを使用することで簡単に実装されます(Introspector.getBeanInfoを使用して簡単にJava Beanのプロパティを取得)。

この方法では、同じクラスの2つのオブジェクトの違いを、違いだけを保持する特別なクラスにマップする2つのユーティリティメソッドがあります。 XMLEncodeとXMLDecodeを別の方法で転送し、オブジェクトを使用してAをBに変換します。

その他の改善点:文字列プロパティのパターンマッチングなどの一般的な型の特別な処理を追加することもできます違いはありますが、2つの文字列の間の実際の違いだけです。

これを行う簡単な簡単な方法の1つは、文字列の最長の一致「開始」と「終了」を特定し、それらの違いを特殊な方法でエンコードすることです。

たとえば、$ charnumber $という形式を使用すると、エンコードされた文字列は$ m $という文字列の中央部分になります。ここでnは置換する中心部分が始まるcharで、mは代替する中心部分が終わるところのchar。もちろん、特殊なcharを選択して(この場合は$)、特殊なcharを使用してエスケープし、後で変換してください。

OBJECT A(名称: "ピッポ"、説明: "ピッポのバージョンA"、年齢:25)

OBJECTのB(名称: "ピッポ"、説明: "私のピッポのバージョンB"、年齢:27)

ABDIFFERENCE(地図:

だから、文字列の違いを読んで説明---> "私の$ 14 $の$ 8 $ B"、年齢---> 27)あなたが作曲する必要があります知っているだろう

"バージョン"($ 8 $のようなA値からの1〜8文字)は、 + 「B of my」($ 8 $ 14の間の差分文字列の相違点 + 「pippo」(Aの値から14文字以上)

関連する問題