2011-12-27 66 views
36

Java新手。在Android應用上工作時學習它。我正在實現一個比較器來對文件列表和比較器應該實現的Android文檔say進行排序可串行化:比較器爲什麼要實現Serializable?

建議比較器實現Serializable。

這是可序列化接口here

我只想對文件列表進行排序。爲什麼我應該實現這個目標,甚至爲什麼它應該用於比較器?

+0

爲什麼Android會關心序列化呢? – irreputable 2011-12-27 07:27:46

+2

@irreputable:你爲什麼不在Android上使用序列化? – Thilo 2011-12-27 07:38:53

回答

47

這不只是一個Android的東西,Java SDK has the same recommendation

注:它一般是比較也實現java.io.Serializable,因爲它們可能被用來作爲一個好主意在可序列化的數據結構中排序方法(如TreeSet,TreeMap)。爲了使數據結構成功序列化,比較器(如果提供)必須實現Serializable。

所以這個想法是,因爲一個TreeMap是可序列化的,並且TreeMap可以包含一個比較器,如果比較器也是可序列化的,這將是一件好事。這同樣適用於集合中的所有元素。

除非您以這種方式使用序列化,否則您可以放心地忽略它。

9

這應該幫助你:http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

注:一般用於比較器來實現java.io.Serializable,因爲它們可能被用來作爲排序的序列化數據結構的方法(是個好主意如TreeSet,TreeMap)。爲了使數據結構成功序列化,比較器(如果提供)必須實現Serializable。

8

Serializeable是一個空白的接口。它不包含任何方法。所以,要實現它,你需要說的是在一個類中的implements Serializable。這對你來說不是一個巨大的負擔。如果你擴展Comparator,你甚至不需要實現Serializable,因爲超類爲你做了這個,然後你根本不需要做任何事情來實現Serializable

當某件東西實現了Serializable時,這意味着該對象可以隨意變成一個字節數組。這用於在因特網上傳輸,在文件中存儲等。非常粗略地說,默認情況下,序列化對對象的工作方式是,將要嘗試序列化的對象所引用的每個對象都取出來,將每個對象將對象轉換爲字節數組(即遞歸地調用串行化),並將字節數組連接起來以產生表示整個對象的字節數組。

現在,爲什麼Comparator實施Serializable?假設您想序列化一個TreeMap或其他一些訂購的Collection。序列化的目標是提供對象的完整表示。像TreeMap這樣的集合在其中有一個Comparator對象,因此爲了能夠生成一個捕獲這些集合的每個方面的字節數組,您需要能夠將Comparator另存爲一個字節數組。因此,Comparator需要爲Serializable,以便可以正確序列化其他內容。

+3

「如果擴展比較器」:比較器是一個接口(並且不擴展Serializable)。 「要實現它,所有你需要說的是在一個類中實現Serializable」你還需要考慮這是否是正確的事情。例如所有實例字段也需要可序列化(或者您需要採取一些措施)。 – Thilo 2011-12-27 07:36:33

0

我已經看到了在Java 5中API Link to java 5 APT 其中指出,通過實施比較並不意味着反正實現Serializable接口,所以一個個有明確關注獲得一些習慣產生比較級序列化

3

要在Java中序列化一個對象,這兩個條件應該得到滿足:

  1. 實例所屬的類必須實現java.io.Serializable。
  2. 該類的成員應該是可序列化的。如果一個或多個成員不被序列化,則應將其標記爲瞬態。

當任何數據結構使用比較器,並且希望該數據結構可序列化時,第2點(上面提到的)迫使比較器實現可串行化。

相關問題