其思想如下: XmlEncoder记录从无到有重新生成序列化bean所需的操作。但如果我们不是从无到有呢?
是否可以使用XmlEncoder来记录将一个对象转换为另一个对象所需的操作?XmlDecoder可以用来实现这种转变吗?
或者,是否有其他方法可以创建描述两个对象之间差异的xml,并使用此xml数据转换对象?
发布于 2009-09-01 14:15:07
XMLEncoder和XMLDecoder本身无法完成所需的操作:映射两个对象之间的XML差异,并使用它将一个对象转换为另一个对象。
但是,如果这两个对象属于同一类型,您可以使用一些魔法来使其按您所希望的方式工作。
我会怎么做:
A)创建一个包含propertyName/propertyValues对的对象。这个类将用于保存对象之间的差异。即使是一个简单的Map(String,Object)也足够了。例如,我将其称为ABDifference。
B)组成一个实用方法,该方法通过自省分析对象A和对象B,并编写一个ABDifference类,其中包含A和B中不同的属性名称和值,其中包含B值。使用Introspector.getBeanInfo获取propertyDescriptor,并使用它们调用getter并使用equals检查属性值。
示例:
对象A(名称:"pippo",描述:“pippo的A版本”,年龄: 25)
对象B(名称:"pippo",描述:“pippo版本B”,年龄: 27)
ABDIFFERENCE (Map: description->“pippo的B版”,age->27)
C)对这个类的对象进行编码,它使用XMLEncoder保存了两个原始对象之间的“差异”。这样,您将获得一个简单的XML编码,它只包含不同于A和B的属性值,而不是整个对象。
D)执行一个实用方法,通过检查ABDifference将A转换为B。通过在映射的键/值对上循环并使用反射调用该属性的设置器(使用Introspector.getBeanInfo轻松获取java属性)将A转换为B,就可以很容易地实现它。
这样,你就有了两个实用方法,它们在一个特殊的类中映射同一类的两个对象之间的差异,而这个类只包含差异。你使用XMLEncode并传输它,然后用另一种方式XMLDecode,然后使用对象将A转换成B。
额外的改进:您甚至可以为常见类型添加特殊处理,比如字符串属性的模式匹配,以避免在差异中写入整个字符串,而只是两个字符串之间的真正差异。
要做到这一点,一种简单而简单的方法是找到字符串中匹配最长的"start“和"end”,然后用一种特殊的方式编码它们之间的差异。
例如,您可以使用以下格式:$charnumber$,因此编码的字符串将是字符串$m$的$n$central部分,其中n是要替换的中心部分开始的字符,m是要替换的中心部分结束的字符。当然,您应该使用一个双特殊字符来转义所选的特殊字符(在本例中为$),然后再将其转换回来。
对象A(名称:"pippo",描述:“pippo的A版本”,年龄: 25)
对象B(名称:"pippo",描述:“我的pippo的版本B”,年龄: 27)
ABDIFFERENCE (地图:描述->“我的$14$中的$8$B”,age->27)
所以读一下字符串的差异,你就会知道你必须像这样组成字符串:
"version“(与A值相差1-8个字符,就像$8$告诉我们的那样)+ "B of my”( $8 $ 14$ + "pippo“之间的差异字符串(来自A值的字符14+ ))
发布于 2009-07-10 18:19:07
我相信如果我们基于javabeans.dtd生成一个可扩展标记语言,XmlDecoder可以从可扩展标记语言转换对象。javabenas.dtd是XmlEncoder模式。我已经附上了解释XmlEncoder如何将对象编码为xml的网址。
我希望它能帮上忙。:)
老虎。
发布于 2009-08-28 09:22:16
XMLDecoder的作用与XMLEncoder完全相反,您可以从对象开始,将其解码为XMLDecoder,然后可以像以前一样使用XMLEncoder再次将其转换为对象。
https://stackoverflow.com/questions/1103701
复制相似问题