【问题标题】:Oracle Coherence Map deserialize errorOracle Coherence Map 反序列化错误
【发布时间】:2014-07-25 14:24:07
【问题描述】:

我有时在反序列化聚合器时随机出错。当尝试反序列化地图时,错误发生在readExternal 方法内部。 HashMap 中的键值对似乎不为空。有没有人见过类似的问题?我正在使用 Oracle 一致性 3.7。堆栈跟踪表明问题发生在从标头读取映射值类型时。

this.calcMap = in.readMap(5, new HashMap<PriceArrayKey, Double>());

writeExternal方法代码

out.writeMap(5, this.calcMap, PriceArrayKey.class, java.lang.Double);

下面给出的堆栈跟踪

Caused by: Portable(java.io.EOFException)
    at com.tangosol.io.AbstractByteArrayReadBuffer$ByteArrayBufferInput.readPackedInt(AbstractByteArrayReadBuffer.java:443)
    at com.tangosol.io.MultiBufferReadBuffer$MultiBufferInput.readPackedInt(MultiBufferReadBuffer.java:683)
    at com.tangosol.io.pof.PofBufferReader.readAsUniformObject(PofBufferReader.java:3344)
    at com.tangosol.io.pof.PofBufferReader.readMap(PofBufferReader.java:2537)
    at com.xyz.coherence.aggregator.Calculator.readExternal(Calculator.java:428)

【问题讨论】:

    标签: java deserialization oracle-coherence


    【解决方案1】:

    您将“2”和“5”显示为不同的属性索引;这似乎是一个明显的问题。

    我还建议仔细查看 PriceArrayKey 序列化,因为那里的错误可能会导致您在此处看到。

    【讨论】:

    • 对不起,当我发布问题时,这是一个错字。代码中的属性索引相同。有趣的是,如果我将 writeExternal 方法更改为此(删除值类型),问题就会消失,这看起来很奇怪。 out.writeMap(5, this.calcMap, PriceArrayKey.class);
    • 是否有可能某些 Double 值为空?或者一些奇怪的东西,比如 Double.NaN?
    • 我用 NaN 和 null 值测试它似乎不会导致问题。无论如何,该值永远不会为空,因为原始双精度值用于值计算。据我了解,如果它尝试读取比实际写入更多的字节,则在读取时会收到 EOFException,这表明连贯性写入的方式存在一些不一致每次。
    • 同意数据的读取和写入似乎有一些差异。它总是有可能出现在 Coherence 代码中,但由于测试覆盖率(以及在数千个系统中的广泛使用),这种可能性较小。尽管如此,它仍然是可能的,所以我建议在有问题的各个类中发布 POF 序列化逻辑。
    【解决方案2】:

    您还没有展示PriceArrayKey 的序列化程序的实现。如果您使用的是PofSerializer 实现,您确定在序列化和反序列化方法中调用了out.writeRemainder(null)in.readRemainder()

    【讨论】:

      猜你喜欢
      • 2013-06-20
      • 2014-02-19
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多