TreeSet自定義Comparator後序列化與反序列化問題
碰到一個比較鬱悶的問題,在TreeSet中定義了一個Comparator之後出現了序列化物件失敗的問題。有興趣可以嘗試一下。
問題:
If java.util.TreeMap customer created by constructor with java.util.Collator parameter, and parameter will not implements java.io.Serializable, the customer isno longer serializable.Object's field 'comparator' is initialized with non-Serializable classinstance of java.util.Comparator, which implements java.util.Collator. This is causing the problem.
The test example to reproduce the bug: ------------------------------------------------------------- import java.io.FileOutputStream; import java.io.ObjectOutputStream; public class test { public static void main(String[] args) { try { java.util.TreeMap obj = new java.util.TreeMap(java.text.Collator.getInstance( new java.util.Locale("en", "US", ""))); FileOutputStream ostream = new FileOutputStream("gold.tmp"); ObjectOutputStream objos = new ObjectOutputStream(ostream); objos.writeObject(obj); objos.close(); } catch (java.io.IOException e) { e.printStackTrace(); } } } -------------------------------------------------------------
Test output: java.io.NotSerializableException: java.text.RuleBasedCollator at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1148) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:366) at java.io.ObjectOutputStream.outputClassFields(ObjectOutputStream.java:1841) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:480) at java.util.TreeMap.writeObject(TreeMap.java:1491) at java.lang.reflect.Method.invoke(Native Method) at java.io.ObjectOutputStream.invokeObjectWriter(ObjectOutputStream.java:1878) at java.io.ObjectOutputStream.outputObject(ObjectOutputStream.java:1210) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:366) at test.main(test.java:14)
原因如下:
In order for classes such java.util.Treemap and java.util.TreeSet to beserialized the Comparators(java.util.Comparator) also need to be serializable.The class java.text.RuleBasedCollator implements Comparator, but does notimplement java.io.Serializable and hence a TreeMap instance intialized withsuch a Comparator can no longer be serialized. Its not clear if there is anyvalue to making java.text.RuleBasedCollator serializable.
就是說為了能夠序列化Treemap和TreeSet,那麼它們所擁有的Comparators必須支援Serializable介面。而java.text.RuleBasedCollator實現了Comparator介面但是卻不支援Serializable介面,這樣導致了擁有RuleBasedCollator的TreeMap例項無法進行序列化。
因此我們可以知道通過將自定義的Comparator實現Serializable介面可以解決該問題。