问题
当使用redisTemplate存储对象的时候会报
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
通过以下方法将对象先转换成16进制byte数组,取出的时候再以16进制还原即可解决
/**
* 字节数组转成16进制表示格式的字符串
*
* @param byteArray 需要转换的字节数组
* @return 16进制表示格式的字符串
**/
public static String toHexString(byte[] byteArray) {
if (byteArray == null || byteArray.length < 1)
throw new IllegalArgumentException("this byteArray must not be null or empty");
final StringBuilder hexString = new StringBuilder();
for (int i = 0; i < byteArray.length; i++) {
if ((byteArray[i] & 0xff) < 0x10)//0~F前面不零
hexString.append("0");
hexString.append(Integer.toHexString(0xFF & byteArray[i]));
}
return hexString.toString().toLowerCase();
}
public static byte[] toByteArray(String hexString) {
if (StringUtils.isEmpty(hexString))
throw new IllegalArgumentException("this hexString must not be empty");
hexString = hexString.toLowerCase();
final byte[] byteArray = new byte[hexString.length() / 2];
int k = 0;
for (int i = 0; i < byteArray.length; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
byteArray[i] = (byte) (high << 4 | low);
k += 2;
}
return byteArray;
}
在使用SpringBoot2、Shiro和Redis整合时遇到对象存储异常,具体表现为尝试存储对象时抛出`java.io.StreamCorruptedException: invalid stream header: EFBFBDEF`。为了解决这个问题,可以采取将对象转换为16进制的byte数组进行存储,然后再从Redis中取出时还原为原对象。
638

被折叠的 条评论
为什么被折叠?



