2012-10-22 40 views
1

我很抱歉,因爲我已經看過這個主題的帖子,但似乎沒有解決我的問題。所以我會盡量做到非常具體。我收到一個StreamCorruptedException當我嘗試打開一個ObjectInputStreamByteArrayInputStream如何在序列化Java對象時解決StreamCorruptedException?

我需要輸出的對象(X509Certificate)到XML文件。我的序列號代碼如下所示:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputSream(bos); 
    oos.writeObject(x509.getData()); // x509 is a DOM Element 
    oos.close(); 
    bos.close(); 

XML文檔看起來很好。我輸入的代碼如下所示:

// elem is a DOM Element with contents placed in Context 
    ByteArrayInputStream bis = new ByteArrayInputStream(
            elem.getTextContext().getBytes()) 
    ObjectInputStream ois = new ObjectInputStream(bis); 
    X509Certificate x509 = (X509Certificate) ois.readObject(); 
    ois.close(); 
    bis.close(); 

堆棧跟蹤我得到的大部分是通過我自己的代碼並沒有什麼內部的JVM,所以很難追查。這是它是什麼:

java.io.StreamCorruptedException: invalid stream header: 5B0A5B0A 
    at java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:783) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
    . my code 
    . my code 

感謝您的任何幫助。

+0

elem.getTextContext()。getBytes()這是從哪裏來的?您需要從ByteArrayOutput流中獲取保存該對象的字節,即bos.toByteArray() –

+0

我很抱歉,我可能會更具體。我在DOM元素中扔文本。 'elem'是「方法」的輸入'getTextContext()'從XML括號內檢索文本。 – jiveturkey

+0

你是否使用完全相同的JVM(包括版本)來序列化和反序列化?有時序列化格式會在版本之間更改而不發出警告 –

回答

0

在將序列化數據放入文本節點之前,您需要對其進行十六進制或基本64位編碼,並在反序列化之前將其解碼。文本節點是字符串,字符串不是二進制數據的容器。

但我不明白的根本問題。有用XML表示證書的標準方式和標準API,但事實並非如此。

+0

我剛剛發現了Base64.encodeBase64String和使用CertificateFactory類重新生成證書所需的Decode塊。我對Java完全陌生,不知道這些API是什麼。任何幫助? – jiveturkey