使用XmlEncoder创建delta / difference xml

时间:2009-07-09 12:56:51

标签: java xml serialization

这个想法如下: XmlEncoder记录从零开始重现序列化bean所需的操作。但是,如果我们不从零开始呢?

可以使用XmlEncoder记录将对象转换为其他对象所需的操作吗? XmlDecoder可以用来进行这种转换吗?

或者是否还有其他方法可以创建一个描述两个对象之间差异的xml并使用这个xml数据转换对象?

3 个答案:

答案 0 :(得分: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(名称:“pippo”,描述:“pippo的版本A”,年龄:25)

OBJECT B(名称:“pippo”,描述:“pippo版本B”,年龄:27岁)

ABDIFFERENCE(地图:描述--->“pippo的B版”,年龄---> 27)

C)对此类的此对象进行编码,该对象使用XMLEncoder保存两个原始对象之间的“差异”。通过这种方式,您将获得一个简单的XML编码,该编码仅保存不同于A到B的属性值,而不是整个对象。

D)执行一种通过检查ABDifference将A转换为B的实用方法。它将通过循环地图的键/值对并使用反射调用该属性的setter(使用Introspector.getBeanInfo轻松获取java bean属性)将A转换为B来轻松实现。

通过这种方式,您可以使用两种实用方法来映射特殊类中同一类的两个对象之间的差异,该类只包含差异。你XMLEncode并以另一种方式传输这个和XMLDecode,然后使用该对象将A转换为B.

附加改进:您甚至可以为常见类型添加特殊处理,例如字符串属性的模式匹配,以避免在差异中写入WHOLE字符串,但只是两个字符串之间的真正差异。

这样做的一个简单方法就是找到字符串中最长的匹配“开始”和“结束”,然后以特殊方式对它们之间的差异进行编码。

例如,您可以使用以下格式:$ charnumber $,因此编码的字符串将是字符串$ m $的$ n $中心部分,其中n是要替换的中心部分开始的字符,而m是字符替代的中心部分结束的地方。当然你应该使用双特殊字符然后转换选择的特殊字符(在这种情况下是$)并将其转换回来。

OBJECT A(名称:“pippo”,描述:“pippo的版本A”,年龄:25)

OBJECT B(名称:“pippo”,描述:“我的宝宝的B版”,年龄:27岁)

ABDIFFERENCE(地图:描述--->“我的$ 14 $ $ 8 $ B”,年龄---> 27)

因此,阅读字符串差异,你会知道你必须像这样编写字符串:

“版本”(来自A值的1-8个字符,如$ 8 $告诉我们) + “我的B”($ 8 $ $ 14 $之间差异字符串的差异 + “pippo”(来自A值的14岁以上)

答案 1 :(得分:0)

我相信如果我们基于javabeans.dtd生成一个xml,XmlDecoder可以从xml转换对象。 javabenas.dtd是XmlEncoder模式。我附上了解释XmlEncoder如何将对象编码为xml的URL。

我希望它有所帮助。 :)

虎。

答案 2 :(得分:0)

XMLDecoder完全与XMLEncoder完全相反,你从你的对象开始并将其解码为xml,然后你可以使用XMLEncoder将它再次转换为一个对象。