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 (Map: description--->"version B of pippo", age--->27)
C) 编码这个类的这个对象,它使用 XMLEncoder 保存两个原始对象之间的“差异”。这样,您将获得一个简单的 XML 编码,它只保存从 A 到 B 不同的属性值,而不是整个对象。
D) 执行一个实用方法,通过检查 ABDifference 将 A 转换为 B。它将很容易实现,通过循环映射的键/值对并使用反射调用该属性的设置器(使用 Introspector.getBeanInfo 轻松获取 java beans 属性)将 A 转换为 B。
这样,您就有了 2 个实用方法,它们将同一类的 2 个对象之间的差异映射到一个仅包含差异的特殊类中。你 XMLEncode 并传输 this 和 XMLDecode 以另一种方式,然后使用对象将 A 转换为 B。
附加改进:您甚至可以为常见类型添加特殊处理,例如字符串属性的模式匹配以避免将整个字符串写入差异,而只是两个字符串之间的真正差异。
一种简单的方法是找到字符串中最长匹配的“开始”和“结束”,并以特殊方式对它们之间的差异进行编码。
例如,您可以使用以下格式:$charnumber$,因此编码后的字符串将是字符串$m$ 的 $n$central 部分,其中 n 是要替换的中心部分开始的字符,m 是字符替换的中心部分在哪里结束。当然,您应该使用双特殊字符转义选择的特殊字符(在本例中为 $),然后将其转换回来。
OBJECT A(名称:“pippo”,描述:“pippo A 版本”,年龄:25)
OBJECT B(名称:“pippo”,描述:“我的 pippo 的 B 版”,年龄:27)
ABDIFFERENCE(地图:描述--->“$8$B of my$14$”,年龄--->27)
所以阅读字符串差异你会知道你必须像这样组成字符串:
"version"(A 值中的 1-8 个字符,就像 $8$ 告诉我们的那样)
+
“B of my”($8$$14$ 之间的差异字符串的差异
+
“pippo”(来自 A 值的 14+ 字符)