首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用newString(bytes[])存储哈泽尔广播缓存中的缓存密钥

使用newString(bytes[])存储哈泽尔广播缓存中的缓存密钥
EN

Stack Overflow用户
提问于 2015-07-02 09:14:51
回答 1查看 698关注 0票数 0

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

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

代码语言:javascript
复制
final Kryo kyroInstance = serializerInstance.get();
kyroInstance.writeObject(output, target);
output.getBuffer();

使用KRYO读取密钥如下

代码语言:javascript
复制
final Kryo kyroInstance = serializerInstance.get();
Object obj = kyroInstance.readObject(input, type);
return obj;

我这里有两个问题。这个方法对你来说好看吗?你对我的用例还有别的方法吗。2.在读取分布式环境中的键时,经常会出现错误NPE,并且这个问题是针对KRYO序列化的。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-05 15:35:20

正如您在注释中所述,您通过以下方法构造键字符串:

代码语言:javascript
复制
String key =new String(byte[]);

这有以下问题:

  1. 要创建字符串,它将输入解释为字节编码字符。使用的编码或在本例中使用的解码是由默认字符集设置确定的。这可能会根据你的环境而改变。
  2. 您的输入是任意字节流。不是每个字节序列在字符编码中都是合法的。见方法注释:

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

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

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

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

  • Arrays.toString(byte[]);
  • Base 64编码来自Java 8: Base64.Encoder.ecodeToString(byte[])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31180411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档