【问题标题】:Using newString(bytes[]) to store as cache key in hazelcast cache使用 newString(bytes[]) 作为缓存键存储在 hazelcast 缓存中
【发布时间】:2015-09-19 17:41:44
【问题描述】:

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

为了使我的缓存键成为字符串,我使用 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 createKeyString(Object key) 的例子吗?
  • @cruftex 我使用以下代码创建字符串 String Key =new String(bytes[]);

标签: java jakarta-ee caching hazelcast kryo


【解决方案1】:

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

String key =new String(byte[]);

这有以下问题:

  1. 为了创建字符串,它将输入解释为字节编码字符。所使用的编码或在这种情况下的解码由默认字符集设置确定。这可能会因您的环境而异。

  2. 您的输入是任意字节流。并非每个字节序列在字符编码中都是合法的。查看方法 cmets:

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

  1. 编码实现可能会在未来的 JDK 版本中发生变化。从 JDK 7 到 JDK 8,UTF8 编码实现发生了变化,请参阅:Java 8 change in UTF-8 decoding

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

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

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

【讨论】:

  • 这种创建字符串的方式对您来说听起来很完美吗?您是否看到分布式设置中的任何问题,其中读写操作螨受到不同环境的影响,尽管在 9/10 情况下我们会获得相同的设置。字符串输出 = new String(Base64.Encoder.encode(bytes), Charset.forname("UTF-8"));
  • Base64.Encoder.encode(bytes)方法返回一个String对象,使用即可。
猜你喜欢
  • 2018-09-30
  • 2013-06-29
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多