使用 newString(bytes[]) 作为缓存键存储在 hazelcast 缓存中

Using newString(bytes[]) to store as cache key in hazelcast cache

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

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

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

使用 KRYO 读取密钥如下

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

我这里有2个问题 1. 你觉得这种方法好吗?对于我的用例,您还有其他方法吗? 2. 在分布式环境中读取密钥时有时会出现 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)

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

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.

  1. 编码实现可能会在未来的 JDK 版本中发生变化。从 JDK 7 到 JDK 8 UTF8 编码实现更改,请参阅:

简而言之:远离这个构造函数。

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

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