2017-08-30 64 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());