2014-01-17 19 views
0

我是序列化概念的新手,我試圖序列化PointF類,因爲我需要通過套接字連接(我使用ObjectOutputStream和ObjectInputStream)發送它。我的問題是發送時,無論發送時我的PointF對象中有什麼值,收到後我得到默認值。序列化點,PointF對象

例如,如果我發送pointF(1.0,4.0)我得到(0.0,0.0)。

以下是我用於實現可序列化的代碼。

public class MyPointF extends PointF implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -455530706921004893L; 

public MyPointF() { 
    super(); 
} 

public MyPointF(float x, float y) { 
    super(x, y); 
} 
} 

有人可以指出問題嗎? 此外,搜索了一下後,我發現這個事情也發生在android.canvas.Path類中。請糾正我錯在哪裏。

回答

1

您的超類PointF不可串行化。這意味着以下適用:

允許非序列化類的子類型序列化,子類型可以承擔保存和恢復超類型的公共狀態,保護的責任,以及(如果可訪問)封裝領域。只有當它繼承的類有一個可訪問的無參數構造函數來初始化類的狀態時,該子類纔可以承擔這個責任。如果不是這種情況,則聲明一個類Serializable是錯誤的。該錯誤將在運行時檢測到。

在反序列化過程中,不可序列化類的字段將使用該類的public或protected no-arg構造函數進行初始化。一個無參數的構造函數必須可以訪問可序列化的子類。序列化子類的字段將從流中恢復。

參見:http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

您需要看readObjectwriteObject

類需要在序列化和反序列化過程中的特殊處理必須實現具有下列準確簽名的特殊方法:

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 

另請參閱:Java Serialization with non serializable parts瞭解更多提示和技巧。

+0

感謝名單的鏈接。 –

0

我終於找到了解決方案。 Thanx @Greg和現在已被刪除的其他評論。解決方法是,不要擴展這些對象,我們可以創建存根對象。正如我從構造函數調用超級,x和y字段是從不可序列化的基類繼承的。所以他們沒有序列化,並沒有發送價值。

,所以我mofidfied我的課,按您的建議

public class MyPointF implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -455530706921004893L; 

public float x; 
public float y; 

public MyPointF(float x, float y) { 
    this.x = x; 
    this.y = y; 
} 
} 
+0

這是爲什麼呢?你真的不需要實現'writeObject()'和'readObject()'嗎? – cgogolin