2017-08-30 88 views
2
Object before = ""; 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    ObjectOutputStream oo = new ObjectOutputStream(os); 
    oo.writeObject(before); 
    oo.close(); 

    String serialized = os.toString("UTF-8"); 

    ByteArrayInputStream is = new ByteArrayInputStream(serialized.getBytes("UTF-8")); 
    try(ObjectInputStream io = new ObjectInputStream(is)) { 
     Object after = io.readObject(); 
     System.err.println("Object deserialization successful."); 
    } catch (Exception e) { 
     System.err.println("Object deserialization error."); 
     System.err.println("Type being serialized: " + before.getClass()); 
     System.err.println("Serialization as bytes: " + Arrays.toString(serialized.getBytes("UTF-8"))); 
     e.printStackTrace(); 
    } 

所以我有一些代码我正在处理这应该序列化一个对象java.lang.String和反序列化它。我使用对象流来完成对象的写入/读取和字节数组流以执行字符串处理。但是当我尝试在序列化对象周围构造一个ObjectInputStream时,我得到一个StreamCorruptedException,声称有一个“无效的流标题”。Java序列化并立即反序列化给出错误

上面的代码示例是我能找到的最基本的一段代码,它再现了我的问题(而且非常简单!)。至于我可以告诉大家,我做的一切完美的对称:

  1. 使围绕一个ByteArrayOutputStream一个ObjectOutputStream
  2. 写(简单!)对象到OOS
  3. 获得从UTF-8字符串在BAOS
  4. 让周围围绕着字符串的UTF-8字节
  5. 一个ByteArrayInputStream ObjectInputStream中从OIS读取对象

但是,在第4步中,在ObjectInputStream的构造函数中,该程序因StreamCorruptedException而崩溃。我非常困惑,因为这些字节字面上是由ObjectOutputStream产生的只是

+0

你觉得'os.toString(“UTF-8”)'做什么?你为什么这么认为?你认为'serialized.getBytes(“UTF-8”)'有什么作用?为什么? –

+0

字符串(逻辑上)是char [],而不是'byte []';转换为'char []'会损坏数据。如果你想传输一个字符串中的数据,请执行像base64编码字节的操作。 –

+0

'String'不是二进制数据的容器。 – EJP

回答

2

不要将byte[]转换为String,也不要将该转换为将要解释特殊(宽)字符的String。而是直接使用ByteArrayOutputStream中的字节。像,

ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());