2012-11-12 52 views
1

快速的問題是,當將一個對象標記爲可序列化時,它是否需要成爲JavaBean?我的意思是,你能序列化一個不是JavaBean的對象嗎?它有風險嗎?如果您打算序列化一個JavaBean對象,是否總是要創建一個對象?Java序列化和JavaBeans

回答

11

您正在尋找了錯誤的方式。一個Java Bean是

1)任何類,它是實現Serializable
2)有一個無參數的構造函數
3)具有私有成員和setter/getter方法

所以你的問題

將對象標記爲可序列化,是否需要成爲JavaBean?

它倒退了。通過實現接口,任何類都可以Serializable。並非所有可序列化的類都定義了一個Java Bean。

我的意思是,你可以序列化一個不是JavaBean的對象嗎?

是的。

如果你打算序列化它,總是使一個JavaBean對象成爲一個好習慣嗎?

這是一個很好的做法,設計你的類與數據封裝在腦海中。這意味着直接限制對字段的訪問,並在適當的地方使用setter和getter。

當然,從API的角度來看,使用公有的無參數構造函數並不總是必需的。

如果您打算使用依賴於您的類爲Java Beans的庫,則只需遵循Java bean標準。

+1

說得好。儘管在實踐中,儘管我可以告訴你即使你的對象沒有實現Serializable,也能獲得JavaBean的大部分優點,所以這兩個概念更加離婚了。 –

+0

我明白了,它讓我很好奇,jvm如何在沒有setter和getter的情況下序列化/重建對象,因爲只有數據是持久的而不是實際的實例,我錯了嗎? – user1777914

+0

大概保持周圍的內部狀態。這篇文章有點過時了,它確實表明在可串行化的類的鏈中某個地方不需要一個無參數的構造函數:http://www.jguru.com/faq/view.jsp?EID=251942 – hvgotcodes

0

如果要序列化一個類的對象,那麼該類需要實現可序列化的接口,而不管它是否具有簡單屬性的bean(或)類。

要序列化對象意味着將其狀態轉換爲字節流,以便字節流可以恢復爲對象的副本。如果Java對象或其任何超類實現了java.io.Serializable接口或其子接口java.io.Externalizable,則該Java對象是可序列化的。反序列化是一個對象的序列化形式轉換回對象

副本的過程中這tutorial可以幫助你

0

您可以序列化實現Serializable接口的任何對象,無論它是否是JavaBean。也就是說,做一個Serializable對象的決定不應該輕易做出,因爲它會鎖定類的某些實現細節,從而降低未來的靈活性。有關實現Serializable的信息,請參閱here

2

可序列化是一個標記接口。每個你用可序列化的接口標記的對象都可以發送出去,或者可以放在一個文件中。例如,如果您標記類Foo與Serializable接口,您能夠安全對象狀態的文件並在以後恢復它:這意味着它並不需要是一個JavaBean

public class Foo implements java.io.Serializable{ 
    public String name; 
} 


public main(){ 
Foo foo = new Foo(); 
foo.name="test"; 
    try 
    { 
    FileOutputStream fileOut = new FileOutputStream("foo.file"); 
    ObjectOutputStream out = new ObjectOutputStream(fileOut); 
    out.writeObject(foo); 
    } 
} 

。它可能是一個普通的舊Java對象,就像Foo對象的例子。

+0

歡迎來到SO。請同時顯示Foo類代碼的完整性。 –