TreeSet自定义Comparator后序列化与反序列化问题

碰到一个比较郁闷的问题,在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接口可以解决该问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值