首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XmlEncoder创建增量/差异xml

使用XmlEncoder创建增量/差异xml
EN

Stack Overflow用户
提问于 2009-07-09 12:56:51
回答 3查看 1.2K关注 0票数 2

其思想如下: XmlEncoder记录从无到有重新生成序列化bean所需的操作。但如果我们不是从无到有呢?

是否可以使用XmlEncoder来记录将一个对象转换为另一个对象所需的操作?XmlDecoder可以用来实现这种转变吗?

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

EN

回答 3

Stack Overflow用户

发布于 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+ ))

票数 1
EN

Stack Overflow用户

发布于 2009-07-10 18:19:07

我相信如果我们基于javabeans.dtd生成一个可扩展标记语言,XmlDecoder可以从可扩展标记语言转换对象。javabenas.dtd是XmlEncoder模式。我已经附上了解释XmlEncoder如何将对象编码为xml的网址。

我希望它能帮上忙。:)

老虎。

票数 0
EN

Stack Overflow用户

发布于 2009-08-28 09:22:16

XMLDecoder的作用与XMLEncoder完全相反,您可以从对象开始,将其解码为XMLDecoder,然后可以像以前一样使用XMLEncoder再次将其转换为对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1103701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档