【发布时间】:2012-04-24 20:03:58
【问题描述】:
我有一个带有 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:类型 'java.lang.String$CaseInsensitiveComparator' 未包含在 可以通过此 SerializationPolicy 序列化的类型集或 无法加载其 Class 对象。出于安全目的,此类型 不会被序列化。: 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_ORDERis 可序列化:一个比较器,它通过 compareToIgnoreCase 对字符串对象进行排序。这个比较器是可序列化的。 那么你会得到什么错误呢? -
其实并非如此。 (@查看编辑)
-
看起来@eneveu 的回答可能会有所帮助。
标签: java serialization gwt guava treemap