【问题标题】:How do you serialize a guava collection?你如何序列化一个番石榴集合?
【发布时间】:2013-03-12 01:11:36
【问题描述】:

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

但我找不到这样做。非常感谢一个人为的代码示例。

有关信息,我的 pom 包含 guavaguava-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"));
}

【问题讨论】:

  • 我最终手动进行了序列化 - 仍然想知道是否有更简单/更有效的方法。
  • 您能澄清一下您是在谈论 Java 序列化还是 GWT 序列化?
  • 不管怎样,在同一个 pom 中同时列出 guava 和 guava-gwt 不是一个好主意!
  • @KevinBourrillion 我不敢说实话 - 我知道 Java 序列化不是直接可行的,我需要将表“保存”到磁盘。所以我最终编写了一个快速的 Java 序列化方法(单独序列化每个单元格),但如果可能的话,我宁愿使用内置的东西。

标签: java serialization deserialization guava


【解决方案1】:

如果您在谈论纯 Java 序列化,是的:TreeBasedTableSerializable

TreeBasedTable 扩展 StandardRowSortedTable 扩展 StandardTable 实现 Serializable

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

Serializable foo = TreeBasedTable.create();

由于编译器没有抱怨这一行,你知道TreeBasedTable 实现了Serializable


更新:

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

【讨论】:

  • 现在不在 PC 前面 - 但是当我尝试时,我认为由于 TreeBasedTable 无法序列化而出现错误(在 oos.writeObject(treeTable);... 将再试一次。
  • @assylias 我猜问题是你在类路径上有同一个类的两个版本。您需要序列化非 GWT 版本。摆脱 GWT 或非 GWT 版本!
  • OK TreeBasedTable 确实是可序列化的。但似乎添加比较器会破坏“可序列化”。更新了问题。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多