java - 使用 newString(bytes[]) 将缓存键存储在 hazelcast 缓存中

标签 java jakarta-ee caching hazelcast kryo

我有一个只接受字符串作为键的缓存。该缓存是遗留系统的一部分,我无法修改它们。要使用此缓存,我需要将缓存键转换为字符串。

为了使我的缓存键成为字符串,我使用 KRYO 对其进行序列化。将它们转换为 bytes[] 并从 bytes[] 创建一个 string。您认为这样做有什么问题吗?我使用下面的代码转换为 bytes[] 获取字节 [] 使用 Kryo :-

final Kryo kyroInstance = serializerInstance.get();
kyroInstance.writeObject(output, target);
output.getBuffer();

使用 KRYO 读取 key 如下

final Kryo kyroInstance = serializerInstance.get();
Object obj = kyroInstance.readObject(input, type);
return obj;

我有两个问题 1. 您觉得这种方法好吗?对于我的用例,您还有其他方法吗? 2. 在分布式环境中读取 key 时有时会出现 NPE 错误,并且该问题特定于 KRYO 序列化。

java.lang.IndexOutOfBoundsException: Index: 34120126, Size: 0 at
java.util.ArrayList.rangeCheck(ArrayList.java:653) at
java.util.ArrayList.get(ArrayList.java:429) at
com.esotericsoftware.kryo.util.MapReferenceResolver.getReadObject(MapReferenceResolver.java:42)
    at com.esotericsoftware.kryo.Kryo.readReferenceOrNull(Kryo.java:830)
    at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:680)

最佳答案

正如您在评论中所述,您可以通过以下方式构造 key 字符串:

String key =new String(byte[]);

这有以下问题:

  1. 为了创建字符串,它将输入解释为字节编码字符。使用的编码(或在本例中为解码)由默认字符集设置确定。这可能会根据您的环境而变化。

  2. 您的输入是任意字节流。并非每个字节序列在字符编码中都是合法的。请参阅方法注释:

The behavior of this constructor when the given bytes are not valid in the default charset is unspecified.

  • 编码实现可能会在未来的 JDK 版本中发生变化。从 JDK 7 到 JDK 8,UTF8 编码实现发生了变化,请参阅:Java 8 change in UTF-8 decoding
  • 简而言之:远离这个构造函数。

    为了您的目的,您可以使用,例如:

    • Arrays.toString(byte[]);
    • 来自 Java 8 的 Base 64 编码:Base64.Encoder.ecodeToString(byte[])

    关于java - 使用 newString(bytes[]) 将缓存键存储在 hazelcast 缓存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31180411/

    相关文章:

    java - 与 double 相当

    java - 如何在 Spark 中将两个 DataFrame 与组合列连接起来?

    java - 为什么我的 java 文本游戏不运行?

    java - GeoTIFF 通过 JAI : No descriptor by name "tiff" is registered

    design-patterns - Dispatcher View 和 Service to work 设计模式有什么区别?

    jsf - 为什么 FacesServlet 不能有/*. 的 url-pattern?

    java - 如何全局设置我的 JEE REST 客户端 header ?

    ruby-on-rails - 如何创建第二个 Rails 内存存储缓存?

    caching - 引用不存在的文件路径和文件的 PHP fatal error

    java - Ignite for Hibernate L2 非常慢