您好我需要读取字节数组作为一个对象。但是,每当我尝试时,它都会打印出Stream CorruptedException。

下面是我的写作代码

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!");
    }
}

然后,这是读取的代码
public class TestWithdaw {
    public static void main(String[] args) {
        JedisHelper helper = JedisHelper.getInstacne();
        Jedis connection = helper.getConnection();
        String key = "redismap";
        String result = connection.get(key);
        byte[] primalData = result.getBytes();
        System.out.println("Byte Arrays : " + Arrays.toString(primalData));

        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;

        try{
            bis = new ByteArrayInputStream(primalData);
            ois = new ObjectInputStream(bis);
            Object resultMap = ois.readObject();

            System.out.println("resultMap : " + resultMap);
            ois.close();
        }catch(Exception e){e.printStackTrace();}
        helper.returnResource(connection);
        helper.destroyPool();
    }
}

这是我收到的错误消息。
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)

我不明白此流 header 有什么问题。
这些是我已经尝试过的:-<
  • 以编写代码将List更改为Vector。 (序列问题)

  • 谢谢你的帮助:D

    最佳答案

    我相信问题出在您存储和检索序列化的字节-执行序列化和反序列化的代码本身就很好。

    没有中间存储,代码将起作用,如下所示:

      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 00 05 73,它是以下Java对象序列化规范常量:
  • STREAM_MAGIC
  • STREAM_VERSION
  • TC_OBJECT

  • 因此,您应将调查重点放在为什么原始数据与原始生成的数据不匹配的原因上。

    让我们继续朝这个方向发展(免责声明:我从未使用过Redis)...

    您可以使用以下代码从Redis获取数据:
    String key = "redismap";
    String result = connection.get(key);
    byte[] primalData = result.getBytes();
    

    在这里,您以Java String的形式获取数据,然后使用Java VM的默认编码方案获取字节。这可能与Redis使用的编码表示形式有所不同。

    为什么不使用返回byte[]的版本?那将是:
    String key = "redismap";
    byte[] primalData = connection.get(key.getBytes());
    

    这在任何Stringbyte[]编码和解码中都可能是一致的。

    关于java - 当readObject时发生StreamCorrupedException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22500807/

    10-15 07:10