Java 读取对象时发生StreamCorrupedException
嗨,我需要读取字节数组作为一个对象。然而,每当我尝试它打印出流腐蚀异常 下面是我的写作代码Java 读取对象时发生StreamCorrupedException,java,exception,header,stream,redis,Java,Exception,Header,Stream,Redis,嗨,我需要读取字节数组作为一个对象。然而,每当我尝试它打印出流腐蚀异常 下面是我的写作代码 public class TestSave { public static void main(String[] args) { String key = "redismap"; Map<String, Object> map = new HashMap<String, Object>(); List<String>
public class TestSave {
public static void main(String[] args) {
String key = "redismap";
Map<String, Object> map = new HashMap<String, Object>();
List<String> list = new ArrayList<String>();
map.put("String", "test");
map.put("List", list);
ObjectOutputStream oos = null;
ByteArrayOutputStream bos = null;
JedisHelper helper = JedisHelper.getInstacne();
Jedis connection = helper.getConnection();
try{
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(map);
byte[] value = bos.toByteArray();
oos.close();
connection.set(key.getBytes(), value);
}catch(Exception e){e.printStackTrace();}
helper.returnResource(connection);
helper.destroyPool();
System.out.println("DONE!");
}
}
这就是我收到的错误信息
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at org.owls.redis.test.TestWithdaw.main(TestWithdaw.java:28)
java.io.StreamCorruptedException:无效的流头:EFBFBDEF
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
位于java.io.ObjectInputStream。(ObjectInputStream.java:299)
位于org.owls.redis.test.TestWithdaw.main(TestWithdaw.java:28)
我不明白这个流标题有什么问题。
这些是我已经尝试过的:-我相信问题在于存储和检索序列化的字节-执行序列化和反序列化的代码本身就很好 如果没有中间存储,代码将正常工作,如下所示:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(map);
byte[] value = bos.toByteArray();
oos.close();
for (byte b : value)
{
System.out.print(Integer.toHexString(0xff & b) + " ");
}
System.out.println("");
final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(value));
final Object read = ois.readObject();
System.out.println("read: " + read);
这将产生:
ac ed 0 5 73 72 0 11 6a 61 76 61 2 E 75 74 69 6c 2 E 48 61 73 68 4d 61 70 5 7 da c1 c3 16 60 d1 3 0 2 46 0 a 6c 6 F 61 64 61 63 74 6 F 72 49 0 9 74 68 72 65 73 6 F 6 c 64 78 70 3 F 40 0 0 0 0 0 0 c 77 8 0 0 0 0 0 0 0 0 0 0 0 0 2 74 6 7 7 7 6 E67 74 0 4 74 65 74 74 74 74 0 4 c 6 6 6 6 6 76 61 76 6 72 72 75 74 7 7 7 6 72 6 c 2 72 72 72 72 72 72 6 7 7 4 c 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 774 78 81 d2 1d 99 c7 61 9d 3 0 1 49 0 4 73 69 7a 65 78 70 0 0 0 0 0 77 4 0 0 0 78
读取:{List=[],String=test}
您将看到,我们发现字节流的开头是ac ed 00 05 73
,这是以下Java对象序列化规范常量:
STREAM\u MAGIC
STREAM\u版本
TC\u对象
让我们继续这个方向(免责声明:我从未使用过Redis) 您可以使用以下代码从Redis获取数据:
String key = "redismap";
String result = connection.get(key);
byte[] primalData = result.getBytes();
在这里,您以Java字符串的形式获取数据,然后使用Java VM的默认编码方案获取字节。这可能与Redis使用的编码表示不同
为什么不使用返回字节[]
的版本?这将是:
String key = "redismap";
byte[] primalData = connection.get(key.getBytes());
这在任何
字符串
到字节[]的编码和解码中都可能是一致的。如果在bos.toByteArray
之前调用oos.close
会发生什么?ObjectOutputStream
被缓冲!在检索数据之前,您需要调用flush()
(或close()
)。@immibis是相同的结果。它仍然显示StreamCorruptedException。@Boristeider我认为这无关紧要,因为写作没有问题。这些代码是分开工作的,但我发布输入代码也是因为它可能有编码问题。是否有类似于connection.get(key)
的东西返回字节数组?字符串不是字节数组-我刚刚注意到您正在将数据转换为字符串并返回。非常感谢。实际上,我担心的是字符编码的密钥集。然而,在我按照您的建议将参数从字符串更改为byte[]之后,它工作得非常好。再次感谢:D@greg当我们在Redis数据存储中使用ISO-8859-1编码时,也发生了类似的事情。最后将所有内容转换为byte[],现在一切正常。谢谢你的回答给了我一些调试的建议。
String key = "redismap";
byte[] primalData = connection.get(key.getBytes());