使用 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[]);
这有以下问题:
为了创建字符串,它将输入解释为字节编码字符。使用的编码,或在本例中为解码,由默认字符集设置决定。这可能会根据您的环境而改变。
您的输入是任意字节流。并非每个字节序列在字符编码中都是合法的。查看方法注释:
The behavior of this constructor when the given bytes are not valid in the default charset is unspecified.
- 编码实现可能会在未来的 JDK 版本中发生变化。从 JDK 7 到 JDK 8 UTF8 编码实现更改,请参阅:
简而言之:远离这个构造函数。
为了您的目的,您可以使用,例如:
- Arrays.toString(byte[]);
- 来自 Java 8 的 Base 64 编码:Base64.Encoder.ecodeToString(byte[])
我有一个只接受字符串作为键的缓存。此缓存是遗留系统的一部分,我无法修改它们。要使用此缓存,我需要将我的缓存键转换为字符串。
为了使我的缓存键成为字符串,我正在使用 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[]);
这有以下问题:
为了创建字符串,它将输入解释为字节编码字符。使用的编码,或在本例中为解码,由默认字符集设置决定。这可能会根据您的环境而改变。
您的输入是任意字节流。并非每个字节序列在字符编码中都是合法的。查看方法注释:
The behavior of this constructor when the given bytes are not valid in the default charset is unspecified.
- 编码实现可能会在未来的 JDK 版本中发生变化。从 JDK 7 到 JDK 8 UTF8 编码实现更改,请参阅:
简而言之:远离这个构造函数。
为了您的目的,您可以使用,例如:
- Arrays.toString(byte[]);
- 来自 Java 8 的 Base 64 编码:Base64.Encoder.ecodeToString(byte[])