java - GWT 序列化 TreeMap 的排序/比较器

标签 java serialization gwt guava treemap

我有一个带有 TreeMap 的可序列化对象。

Map<String, Dogs> dogsByNames = Maps.newTreeMap(); // guava style

到目前为止,一切都很好。 现在忽略键的大小写是必要的:

Map<String, Dogs> dogsByNames = Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);

这不起作用,因为 String.CASE_INSENSITIVE_ORDER 不可序列化:

com.google.gwt.user.client.rpc.SerializationException: Type 'java.lang.String$CaseInsensitiveComparator' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = java.lang.String$CaseInsensitiveComparator@f26f68

所以我自己创建了一个:

private static abstract class MyComparator<T>
    implements
        Comparator<T>, // extends Ordering<T> do not work
        IsSerializable { // Serializable do not work
}

public static final MyComparator<String> CASE_INSENSITIVE_ORDER = new MyComparator<String>() {
    @Override
    public int compare(final String left, final String right) {
        if (null == left) {
            return (null == right) ? 0 : -1;
        } else if (null == right) {
            return 1;
        }
        return left.compareToIgnoreCase(right);
    }
};

但是还是不行。

怎么了?

解决方案:

protected static class MyOrdering // no-private!!!
    extends
        Ordering<String>
    implements
        IsSerializable {
    @Override
    public int compare(final String left, final String right) {
        if (null == left) {
            return (null == right) ? 0 : -1;
        } else if (null == right) {
            return 1;
        }
        return left.compareToIgnoreCase(right);
    }
}

public static final Ordering<String> CASE_INSENSITIVE_ORDER = new MyOrdering();

最佳答案

您创建的 CASE_INSENSITIVE_ORDER 是一个匿名类,无法在 GWT 中序列化。要使其 GWT 可序列化,您需要

  1. 创建自定义顶级类(如

    CaseInsensitiveOrder implements Comparator<..>, Serializable {
        ...
    }
    
  2. 像您一样创建常量 CASE_INSENSITIVE_ORDER

  3. 为该类创建一个自定义字段序列化程序 (CaseInsensitiveOrder_CustomFieldSerializer),它在 deserialize() 上返回 CASE_INSENSITIVE_ORDER 实例。

关于java - GWT 序列化 TreeMap 的排序/比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10124202/

相关文章:

java - 为单元测试中的 @Value 字段提供上下文

java - 将通用 ArrayList 设置为零

java - izpack 安装程序输入属性文件没有密码字段的输入

java - 如何在 java swing 应用程序中显示验证码

java - 加速 java 深度复制操作

c# - 使用 WCF 将 JSON 对象的一部分序列化和反序列化为字符串

java - 序列化包含不可序列化类的类

GWT 2.1 和编辑器机制,如何?

java - 如何使用 ScrollTable 实现自定义 ColumnSorter(GWT 孵化器)

java - 处理来自 Restful 或 JAX-RS Web 服务的重定向响应