2009-07-09 33 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+)