4

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 によってシリアル化できるタイプのセットに含まれていないか、そのクラス オブジェクトを読み込めませんでした。セキュリティ上の理由から、この型はシリアル化されません。: インスタンス = 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();
4

2 に答える 2

5

作成した CASE_INSENSITIVE_ORDER は匿名クラスであり、GWT でシリアライズできません。GWT でシリアライズ可能にするには、以下が必要です。

  1. カスタムのトップレベル クラスを作成します (

    CaseInsensitiveOrder implements Comparator<..>, Serializable {
        ...
    }
    
  2. あなたがしたように定数を作成しますCASE_INSENSITIVE_ORDER

  3. そのクラス ( ) のカスタム フィールド シリアライザーを作成します。これにより、 のインスタンスCaseInsensitiveOrder_CustomFieldSerializerが返されます。CASE_INSENSITIVE_ORDERdeserialize()
于 2012-04-13T00:44:02.167 に答える
0

エラーのスタックトレースが役立ちます。しかし、次のような例外が発生するという推測を危険にさらします。

com.google.gwt.user.client.rpc.SerializationException: タイプ 'com.foo.Bar.MyComparator' が、この SerializationPolicy によってシリアル化できるタイプのセットに含まれていないか、そのクラス オブジェクトを読み込めませんでした。セキュリティ上の理由から、この型はシリアル化されません

これは、GWT がコンパイル時に、シリアル化する必要がある可能性のあるすべての型のリストを作成するために発生します。これが「連載ポリシー」です。そのために、GWT はすべての RPC メソッドで引数と戻り値の型を検査し、すべての「到達可能な」型を検索します。

Comparator がシリアライズされることをコンパイラが認識しない可能性があり、シリアライゼーション ポリシーに追加されません。

回避策は、 this other SO answerで説明されているように、シリアル化する必要がある可能性のあるすべての型をパラメーターとして受け取るダミー メソッドを宣言することです。何かのようなもの:

// in your RPC interface
SerializationWhitelist dummyMethodForSerializationPolicy(SerializationWhitelist serializationWhiteList);

// the SerializableWhiteList class
public class SerializationWhitelist {
    public Bar.MyComparator<String> myComparator;
}
于 2012-04-12T22:08:16.310 に答える