【问题标题】:Java Serialization ComparatorJava 序列化比较器
【发布时间】:2009-12-06 20:13:25
【问题描述】:

是否可以用比较器序列化 TreeMap??

我已经测试过,它可以很好地序列化没有比较器的树形图,当您添加比较器时,它会引发异常。

如果我将比较器声明为瞬态,它仍然不起作用。仅当我使每个树图都瞬态时才有效,但在这种情况下它不会序列化树。

【问题讨论】:

  • 您要序列化哪个类的对象?
  • 程序中的所有类都在实现和导入序列化。这是动物园课
  • 请提供例外情况。听起来您的比较器不可序列化,但堆栈跟踪会显示哪个类失败。

标签: java serialization comparator


【解决方案1】:

您尝试序列化的所有类都必须实现java.io.Serializable 接口。此外,您的类中的每个成员变量都应该是Serializable。事实上,你的整个层次结构应该是。

【讨论】:

  • 这个必须是正确的答案。 java.sun.com/j2se/1.4.2/docs/api/java/io/…
  • 这可能是问题所在,我已经摸索了一下,不知道带有比较器的树形图是否可序列化
  • TreeMap 是可序列化的。看看别处。
  • treemap 是,但带有比较器的 treemap 不是。这就是要我死的原因。我已经用比较器序列化了,没有它就可以正常工作。
  • 让你的比较器实现可序列化。将其声明为私有类,而不是匿名类。
【解决方案2】:

java.util.TreeMap 不是问题,您的 comparator 可能是。

你需要做的就是重写你的比较器类

// throws a 'java.io.NotSerializableException'
class ThisIsNotSerializable implements Comparator<String> {
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
}

class ThisIsSerializable implements Comparator<String>, Serializable {
    private static final long serialVersionUID = -5972458403679726498L;

    public int compare(String arg0, String arg1) {
        return arg0.compareTo(arg1);
    }
}

更多信息和source

【讨论】:

    【解决方案3】:

    如需更多帮助,请查看this。其他需要考虑的事项(如本文档和其他地方所述):

    • 版本控制
    • 对象的自定义序列表单
    • 您的对象的哪些字段应该被序列化,哪些是瞬态

    【讨论】:

    【解决方案4】:

    TreeMap 在这里没有做任何特别的事情。如果可以序列化的 TreeMap 和不序列化的 TreeMap 之间的唯一区别是您的比较器......那么您的比较器是不可序列化的。

    您是如何实现比较器的?您的瞬态声明对于没有瞬态引用的 TreeMap 类毫无意义。

    异常说明了什么?

    【讨论】:

      【解决方案5】:

      您可能会发现它就像将 Comparator 字段更改为静态成员而不是实例成员一样简单:

      public final static Comparator<String> ID_IGN_CASE_COMP
      

      您需要确保所有其他字段都是可序列化的,但这应该是一个开始。

      【讨论】:

      • 不是因为它,比较器不可序列化,但即使我将其声明为瞬态,它仍然会抛出,因为 TreeMap 使用了比较器。
      • 那么答案肯定是让 Comparator Serializable。
      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多