2013-06-12 51 views
1

如果我寫我這樣的代碼,它提供了一個錯誤「找不到文件訪問被拒絕......」如何序列化Java對象 - 將對象作爲InputStream

public class ImplRegistration implements IRegistration { 
@Override 
    public boolean newRegistration(Registration_BE reg_be) { 
     FileOutputStream fos = new FileOutputStream("serial.ser"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(reg_be); 
    } 
} 

出於安全原因,我將代碼的第四行更改爲:

FileOutputStream fos = new FileOutputStream("f://serial.ser"); 

但是之後它顯示了異常java.io.NotSerializableException: java.io.ByteArrayInputStream

如何序列化對象?

+3

確保你的對象序列化實現了'Serializable'接口。此外,如果您共享有問題的代碼併發布堆棧跟蹤而不是錯誤消息,那將會很好。 –

+0

我使用Windows 8,所以即使我給c://我也顯示訪問被拒絕。 – sabarirajan

+2

'C:/'總是會讓你拒絕訪問。請注意,在Windows中,路徑應該像'f:\\\\ some \\ path',或者再次使用'/ some/path'。 –

回答

0

如果您嘗試訪問操作系統(OS)分區中的文件,則會導致訪問被拒絕錯誤。

+0

這是不相關的,看看上面的註釋,問題是ByteArrayInputStream是不可序列化的 –

1

這種情況下的序列化操作失敗,因爲Ted Hopp在上面的註釋中聲明瞭您嘗試序列化的類包含一個非瞬態(和不可序列化)的ByteArrayInputStream對象。爲了解決這個問題,使Registration_BE類序列化,你可以標記該字段爲瞬態:

class Registration_BE { 
    // rest of class 

    private transient ByteArrayInputStream bais = null; 

    // rest of class 
} 

這將導致其從Registration_BE的序列化過程中被省略,但也將導致它未初始化時,對象在另一端被反序列化。

如果你想初始化反序列化後的ByteArrayInputStream的,你可能要考慮編寫自定義的writeObject /的readObject方法的Registration_BE類。 Google上有很多自定義序列化的教程。在這個線程中的信息可以幫助您開始:

Uses of readObject/writeObject in Serialization

+0

科茨謝謝你。正如特德所述,現在我無法在Web服務中接收輸入流,所以我刪除了我的班級中的tat域。但它仍然不是爲什麼? – sabarirajan

+0

請比「它還沒有工作」更具體。刪除該字段後是否生成新的錯誤消息?如果是這樣,請張貼它,最好用堆棧跟蹤。如果可能的話,也許會發布你的課程的代碼。 – Houser

+0

http://stackoverflow.com/questions/17057927/getting-error-while-receiving-object-in-restful-webservice – sabarirajan