2015-08-31 163 views
-1

我已經開始在過去幾周通過套接字發送數據。我開始通過發送多個字符串與我的數據,然後將數據解析成浮動或我需要的類型。但隨着時間的推移,我注意到我的客戶端開始放慢速度,因爲它的讀取和轉換多個字符串,並使用它們,而我的服務器只是把它們拋出。所以我開始發送可工作的Serializable對象,但是我對它們有一些疑問。Java可序列化對象

public class Packet implements Serializable{ 
    private static final long serialVersionUID = -7896044384334791233L; 
    //data here 
} 

我發送的類看起來像這樣,但有我想發送的數據。刪除串行版本號創建一個錯誤。什麼是serialVersionUID,如果它在我發送的所有對象中都是一樣的,那麼爲什麼我的程序需要這麼長時間?

+1

請參閱[本](http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it)。你能解釋出現的錯誤嗎? – TNT

+0

Theres沒有錯誤我只是要求解釋一下串行版本通過套接字發送對象扮演的角色 – Ryan

回答

0

這是一種說出數據格式的方法。如果您從類別 中刪除了一個字段,則應該更改serialVersionUuid,否則對象的使用者可能會錯誤地讀取它。

看看這個答案。

Why generate long serialVersionUID instead of a simple 1L?

看到這個鏈接查看不兼容的修改,如刪除領域。 http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html

此外,您可以覆蓋Java用於使用writeObject和readObject序列化對象的默認方法。如果您知道壓縮對象數據(例如)會導致組件之間的網絡流量較少,這可能很有用。或者,也許有一些自定義的方式要發送比默認Java方式更優化的數據。

查看此答案。 Java Custom Serialization

+0

如果你添加一個新的字段給你,你應該不*改變'serialVersionUID'。您需要閱讀對象序列化規範的版本控制章節。 – EJP

+0

真的嗎?也許我應該。你能告訴我爲什麼嗎?你應該怎麼辦? – tom

+0

我在我的答案中找到了規範並在其中包含對它的引用。 – tom