3

我一定遗漏了一些明显的东西,但我无法序列化TreeBasedTable. 它被标记为@GwtCompatible(serializable = true),所以我的理解是我需要使用该guava-gwt库来(反)序列化它。

但我找不到这样做。一个人为的代码示例将不胜感激。

有关信息,我的 pom 包含guavaand guava-gwt,两个版本都是 14.0.

编辑

所以多亏了答案,我现在明白 TreeBasedTable 是可序列化的。所以我删除了所有 gwt 引用并让它工作。但是,这段代码仍然失败(这是让我认为 TreeBasedTable 不可序列化的代码) - 所以我猜问题出在自定义比较器上......

public static void main(String[] args) throws Exception {
    //with the following table it works
    //Table<Integer, String, Object> table = TreeBasedTable.create();

    //but with this one, it fails
    Table<Integer, String, Object> table = TreeBasedTable.create(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.compareTo(o2);
        }
    }, String.CASE_INSENSITIVE_ORDER);

    table.put(1, "s", 123);

    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(Paths.get("c:/temp/test").
            toFile()));) {
        oos.writeObject(table);
    }

    Table<Integer, String, Object> saved = null;

    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Paths.get("c:/temp/test").
            toFile()));) {
        saved = (Table<Integer, String, Object>) ois.readObject();
    }

    System.out.println(table.equals(saved));
    Files.delete(Paths.get("C:/temp/test"));
}
4

1 回答 1

3

如果您谈论的是纯 Java 序列化,是的:TreeBasedTableis Serializable.

TreeBasedTable扩展StandardRowSortedTable哪个扩展StandardTable哪个实现Serializable

顺便说一句:一个简单的检查会帮助你:

Serializable foo = TreeBasedTable.create();

由于编译器不会抱怨这一行,因此您知道TreeBasedTableimplements Serializable


更新:

String.CASE_INSENSITIVE_ORDER实现Serializable,所以您需要做的就是将匿名整数比较器重构为实现的内部类Serializable。或者:更好的是,Ordering.natural()改用它,这Serializable已经是。

于 2013-03-12T14:52:58.730 回答