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

时间:2015-07-02 09:14:52

标签: java java-ee caching hazelcast kryo

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

要使我的缓存键变为字符串,请使用KRYO对其进行序列化。将它们转换为bytes[]并从string创建bytes[]。你看到这样做有什么问题吗?我使用以下代码转换为bytes[] 获取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.在分布式环境中读取密钥时,有时会出现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)

1 个答案:

答案 0 :(得分:1)

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

String key =new String(byte[]);

这有以下问题:

  1. 要创建String,它会将输入解释为字节编码字符。使用的编码或在这种情况下的解码由默认字符集设置确定。这可能会根据您的环境而改变。

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

  3.   

    未指定给定字节在默认字符集中无效时此构造函数的行为。

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

      出于您的目的,您可以使用,例如:

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