1. 程式人生 > >TreeSet自定義Comparator後序列化與反序列化問題

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介面可以解決該問題。