0

我遇到了与 xstream 和 IBM J9 jdk(32 位版本)不兼容的问题。当我使用 sun jdk 时一切正常,但在 IBM jdk 上失败(仅在 linux 上。在 Windows 上,两个 jdk 都可以)。

调试时,错误似乎是 xstream 在内部使用 java.util.TreeSet 但集合的迭代器以错误的顺序返回元素(我知道这听起来很奇怪,但这是我看到的行为)。谷歌搜索相关的错误并没有给出任何有意义的结果

我尝试升级几乎所有可能的组件,但没有运气。我尝试了以下配置:

  • ibm jdk 1.6 SR 7(与 WebSphere 7.0.0.9 捆绑),xstream 1.2.2
  • ibm jdk 1.6 SR 8,xstream 1.2.2
  • ibm jdk 1.6 SR 8,xstream 1.3.1

(我用tomcat和WebSphere服务器都试过了,所以实际上有6种使用IBM jdk的配置)。

有问题的代码在com.thoughtworks.xstream.core.DefaultConverterLookup第 44 行附近的 class 中。它使用来自 class 的迭代器com.thoughtworks.xstream.core.util.PrioritizedList,该迭代器使用自定义比较器,但比较器所做的只是比较整数(优先级)。

有没有人见过这个?知道我能做什么或改变什么吗?

4

1 回答 1

0

问题最终出在我自己的代码中。插入集合中的对象之一有一个带有 value 的整数键(优先级)Integer.MIN_VALUE。不幸的是,XStream 使用的比较器不比较 int 值,它从另一个中减去一个并比较为零(类似于return b - a > 0.

这导致了整数溢出和比较器返回值的意外结果,整个集合都搞砸了。事实证明,迭代器在 IBM jdk 和 sun jdk 上都以错误的顺序返回了元素,但不知何故,在 sun 上它非常微妙,直到现在我们才注意到它。

解决方法是简单地使用一些低值,例如 -1000 而不是 Integer.MIN_VALUE。

于 2010-06-03T21:02:02.700 回答