碰到一个比较郁闷的问题,在TreeSet中定义了一个Comparator之后出现了序列化对象失败的问题。有兴趣可以尝试一下。
最后Google了一下发现这是一个bug,或者其实也算不上bug,具体可以参考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4330877
问题:
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接口可以解决该问题。