【问题标题】:Using XmlEncoder to create delta/difference xml使用 XmlEncoder 创建增量/差异 xml
【发布时间】:2023-03-29 10:33:01
【问题描述】:

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

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

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

【问题讨论】:

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

标签: java xml serialization


【解决方案1】:

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+ 字符)

【讨论】:

    【解决方案2】:

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

    我希望它有所帮助。 :)

    老虎。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-04-16
        • 2014-07-05
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多