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

Java 使用XmlEncoder创建增量/差异xml,java,xml,serialization,Java,Xml,Serialization,其思路如下: XmlEncoder记录从零开始复制序列化bean所需的操作。但如果我们不是从零开始呢 XmlEncoder可以用来记录将一个对象转换为另一个对象所需的操作吗?XmlDecoder可以用来进行这种转换吗 或者,是否有其他替代方法来创建描述两个对象之间差异的xml并使用此xml数据转换对象?我相信,如果我们基于xml生成xml,XmlDecoder可以从xml转换对象。dtd是XmlEncoder模式。我附上了一个URL,它解释了XmlEncoder如何将对象编码为xml 我希望这能

其思路如下: XmlEncoder记录从零开始复制序列化bean所需的操作。但如果我们不是从零开始呢

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


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

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

我希望这能有所帮助


tiger.

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

XMLEncoder和XMLDecoder本身不能用于完成您需要的工作:映射两个对象之间的XML差异,并使用它将一个对象转换为另一个对象

但是,如果这两个对象是同一类型的,您可以使用一些魔法使其按照您的意愿工作

我要做的是:

A) 创建一个包含propertyName/propertyValues对的对象。此类将用于保存对象之间的差异。即使是一个简单的映射(字符串、对象)也足够了。例如,我称之为Abderence

B) 组成一个实用方法,该方法通过内省分析对象A和对象B,并编写一个ABDifference类,该类保存A和B中不同的属性名称和值,并保存B值。使用Introspector.getBeanInfo获取propertyDescriptor,并使用它们调用getter并使用equals检查属性值

例如:

对象A(名称:“pippo”,描述:“pippo版本A”,年龄:25岁)

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

差异(地图:描述-->皮波B版,年龄-->27岁)

C) 对此类的此对象进行编码,该类使用XMLEncoder保存两个原始对象之间的“差异”。这样,您将得到一个简单的XML编码,它只保存从a到B的属性值,而不是整个对象

D) 执行一个实用方法,通过检查Abderence将A转换为B。通过在映射的键/值对上循环,并使用反射调用该属性的setter(使用Introspector.getBeanInfo轻松获取JavaBeans属性),将A转换为B,它将很容易实现

这样,您就有了两个实用程序方法,它们将同一类的两个对象之间的差异映射到一个特殊类中,该类只包含这些差异。您可以对其进行xmlcode和传输,并以另一种方式进行XMLDecode,然后使用该对象将A转换为B

额外的改进:您甚至可以为普通类型添加特殊的处理方法,比如字符串属性的模式匹配,以避免在差异中写入整个字符串,而只写入两个字符串之间的真正差异

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

例如,您可以使用以下格式:$charnumber$,因此编码字符串将是字符串$m$的$n$中心部分,其中n是要替换的中心部分开始的字符,m是要替换的中心部分结束的字符。当然,您应该使用一个双特殊字符来转义所选的特殊字符(在本例中为$),并在转义后将其转换回

对象A(名称:“pippo”,描述:“pippo版本A”,年龄:25岁)

对象B(名称:“pippo”,描述:“我的pippo版本B”,年龄:27岁)

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

因此,阅读字符串差异,您将知道必须按如下方式组合字符串:

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

有趣的概念。你能举个简单的例子吗?