gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:21:26 25 4
gpt4 key购买 nike

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

为了使我的缓存键成为字符串,我使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com