2009-07-09 63 views
2

這個想法如下: XmlEncoder記錄從無到有再生序列化bean所需的操作。但是,如果我們不是從一無所有開始呢?使用XmlEncoder創建增量/差異xml

是否可以使用XmlEncoder來記錄將對象轉換爲其他對象所需的操作? XmlDecoder可以用來進行這種轉換嗎?

或者是否有任何其他的選擇來創建一個描述兩個對象之間的差異和使用這個XML數據轉換對象的XML?

+0

有趣概念之間的差異串差 「我的B」。你能舉一個簡單的例子嗎? – skaffman 2009-07-09 12:59:06

回答

0

我相信如果我們根據javabeans.dtd生成一個xml,XmlDecoder可以從xml轉換對象。 javabenas.dtd是XmlEncoder模式。我附上了解釋XmlEncoder如何將對象編碼爲xml的URL。

我希望它有幫助。 :)

老虎。

0

XMLDecoder與XMLEncoder完全相反,您從您的對象開始並將其解碼爲xml,然後您可以像使用XMLEncoder一樣將它再次轉換爲對象。

1

本身XMLEncoder和XMLDecoder不能用於做你所需要的:映射兩個對象之間的XML差異,並用它來將一個對象轉換成另一個對象。

但是,如果2個物體屬於同一類型,則可以使用一些魔法使其按照您的意願工作。

我會怎麼做:

A)創建一個保存propertyName的/ propertyValues對的對象。這個類將用於保存對象之間的差異。即使是簡單的Map(String,Object)也足夠了。例如,我將此稱爲ABDifference。

B)創建了一種實用方法,通過自檢分析對象A和對象B,並編寫一個ABDifference類,該類包含A和B中不同的屬性名稱和值,並保存B值。使用Introspector.getBeanInfo獲取propertyDescriptor並使用它們調用getter並使用equals檢查屬性值。

實施例:

OBJECT A(名: 「皮波」,描述: 「皮波的版本A」,年齡:25)

對象B(名: 「皮波」,描述:「版本乙皮波的」,年齡:27)

ABDIFFERENCE(地圖:描述---> 「皮波的版本B」,年齡---> 27)

C)編碼該類,其持有的該對象使用XMLEncoder的兩個原始對象之間的「差異」。通過這種方式,您將獲得一個簡單的XML編碼,該編碼只保存了不同於A到B的屬性值,而不是整個對象。

D)通過檢查ABDifference來實現將A轉換爲B的實用方法。通過在地圖的Key/Value對上循環並使用反射來調用該屬性的setter(使用Introspector.getBeanInfo輕鬆獲取Java bean屬性)以將A轉換爲B,它將很容易實現。

這樣你就有2個實用方法,它們將相同類中的2個對象之間的差異映射到只包含差異的特殊類中。你XMLEncode並將其轉換爲XMLDecode,然後使用該對象將A轉換爲B.

附加改進:甚至可以爲常見類型添加特殊處理,例如字符串屬性的模式匹配以避免編寫整個字符串在差異,但只是兩個字符串之間的真正區別。

一個簡單的方法來做到這一點將找到最長的匹配字符串的「開始」和「結束」,只是以特殊的方式編碼它們之間的差異。

例如,您可以使用以下格式:$ charnumber $,因此編碼字符串將是字符串$ m $的$ n $中心部分,其中n是要替換的中心部分的字符,m是char替代的中心部分結束。當然你應該選擇一個特殊的字符($在這種情況下),用一個雙重特殊字符,然後將其轉換回來。

OBJECT A(名稱: 「皮波」 的描述: 「皮波的版本A」,年齡:25)

對象B(名稱: 「皮波」 的描述: 「我皮波的版本B」,年齡:27)

ABDIFFERENCE(圖:描述---> 「我的$ $ 14 $ $ 8 B」,年齡---> 27)

所以在字符串差異,你會知道你要撰寫像這樣的字符串:

「版本」(1-8個字符來自A值,如$ 8 $告訴我們) + (中$ $ 8 $ $ 14 + 「皮波」(從A值字符14+)