gpt4 book ai didi

java - 使用 XmlEncoder 创建增量/差异 xml

转载 作者:行者123 更新时间:2023-11-30 12:01:08 25 4
gpt4 key购买 nike

思路如下:XmlEncoder 记录了从零开始重现序列化 bean 所需的操作。但是,如果我们不从零开始呢?

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

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

最佳答案

XMLEncoder 和 XMLDecoder 本身不能用于执行您需要的操作:映射两个对象之间的 XML 差异并使用它来将一个对象转换为另一个对象。

但是,如果这 2 个对象属于同一类型,您可以使用一些魔法使其按您希望的方式工作。

我会做什么:

A) 创建一个包含 propertyName/propertyValues 对的对象。此类将用于保存对象之间的差异。即使是一个简单的 Map(String, Object) 就足够了。例如,我将此称为 ABDifference。

B) 构建一个实用方法,通过内省(introspection)分析对象 A 和对象 B,并编写一个 ABDifference 类,其中包含 A 和 B 中不同的属性名称和值,以及 B 值。使用 Introspector.getBeanInfo 获取 propertyDescriptor 并使用它们调用 getter 并使用 equals 检查属性值。

例子:

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

OBJECT B(名称:“pippo”,描述:“pippo B 版”,年龄:27)

ABDIFFERENCE( map :描述--->“pippo B 版”,年龄--->27)

C) 编码这个类的这个对象,它使用 XMLEncoder 保存两个原始对象之间的“差异”。通过这种方式,您将获得一个简单的 XML 编码,它只包含例如 A 到 B 不同的属性值,而不是整个对象。

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

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

其他改进:您甚至可以为常见类型添加特殊处理方式,例如字符串属性的模式匹配,以避免在差异中写入整个字符串,但只是两个字符串之间的真正差异。

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

例如,您可以使用这种格式:$charnumber$,因此编码后的字符串将是字符串的 $n$central 部分 $m$,其中 n 是要替换的中心部分开始的字符,m 是字符替换的中心部分结束的地方。当然,您应该使用双特殊字符对选择的特殊字符(在本例中为 $)进行转义,然后再将其转换回来。

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

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

ABDIFFERENCE( map :描述--->“$8$B of my$14$”,年龄--->27)

所以阅读字符串差异你会知道你必须像这样组成字符串:

“版本”(A 值中的 1-8 个字符,就像 $8$ 告诉我们的那样)+“B of my”($8$ $14$ 之间差异字符串的差异+“pippo”(来自 A 值的字符 14+)

关于java - 使用 XmlEncoder 创建增量/差异 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com