您的位置:首页 > 编程语言 > Java开发

java序列化和反序列化放缓存的问题

2017-01-20 17:49 337 查看
在序列化和反序列化后,在放入缓存的时候不要用byte.tostring,直接放入byte字节数组,因为在序列化中,toString和“”.getByte()默认的编码是不一样的,这样就存在一个问题,序列化了,然后饭序列化不出来了。

java.io.StreamCorruptedException: invalid stream header:EFBFBDEF

The provided test code serializes an object to a ByteArrayOutputStream,
converts the generated byte array into a string using the
ByteArrayOutputStream.toString() method, converts the string back into a byte
array using the String.getBytes() method, and then attempts to deserialize the
object from the byte array using a ByteArrayInputStream.  This procedure will
in most cases fail because of the transformations that take place within
ByteArrayOutputStream.toString() and String.getBytes(): in order to convert the
contained sequence of bytes into a string, ByteArrayOutputStream.toString()
decodes the bytes according to the default charset in effect; similarly, in
order to convert the string back into a sequence of bytes, String.getBytes()
encodes the characters according to the default charset.

Converting bytes into characters and back again according to a given charset is
generally not an identity-preserving operation.  As the javadoc for the
String(byte[], int, int) constructor (which is called by
ByteArrayOutputStream.toString()) states, "the behavior ... when the given
bytes are not valid in the default charset is unspecified".  In the test case
provided, the first two bytes of the serialization stream, 0xac and 0xed (see
java.io.ObjectStreamConstants.STREAM_MAGIC), both get mapped to the character
'?' since they are not valid in the default charset (ISO646-US in the JDK I'm
running).  The two '?' characters are then mapped back to the byte sequence
0x3f 0x3f in the reconstructed data stream, which do not constitute a valid
header.

The solution, from the perspective of the test case, is to use
ByteArrayOutputStream.toByteArray() instead of toString(), which will yield the
raw byte sequence; this can then be fed directly to the
ByteArrayInputStream(byte[]) constructor.

byte[] serializedBean = SerializeUtils.serialize(new GiftBean(awardType),GiftBean.class);
//礼包加到礼包池
Long l0 = cacheClusterClient.sadd(RedisKeyConstant.GIFT_BAG_POOL.getBytes(), serializedBean);


Set<byte[]> byteSet = cacheClusterClient.smembers(RedisKeyConstant.GIFT_BAG_POOL.getBytes());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: