0

Windows Azure Mobile Android でカスタム シリアライザーを実装するために、このチュートリアルに従っています。コードを使用しようとしていますが、E 変数でエラーが発生します。

public class CollectionSerializer implements JsonSerializer<Collection>, JsonDeserializer<Collection>{

public JsonElement serialize(Collection collection, Type type,
                             JsonSerializationContext context) {
    JsonArray result = new JsonArray();
    for(E item : collection){
        result.add(context.serialize(item));
    }
    return new JsonPrimitive(result.toString());
}


@SuppressWarnings("unchecked")
public Collection deserialize(JsonElement element, Type type,
                              JsonDeserializationContext context) throws JsonParseException {
    JsonArray items = (JsonArray) new JsonParser().parse(element.getAsString());
    ParameterizedType deserializationCollection = ((ParameterizedType) type);
    Type collectionItemType = deserializationCollection.getActualTypeArguments()[0];
    Collection list = null;

    try {
        list = (Collection)((Class<?>) deserializationCollection.getRawType()).newInstance();
        for(JsonElement e : items){
            list.add((E)context.deserialize(e, collectionItemType));
        }
    } catch (InstantiationException e) {
        throw new JsonParseException(e);
    } catch (IllegalAccessException e) {
        throw new JsonParseException(e);
    }

    return list;
}
}
4

1 に答える 1

2

次のようにクラスを宣言するつもりだった可能性があります。

public class CollectionSerializer<E> implements JsonSerializer<Collection<E>>,
                                                JsonDeserializer<Collection<E>> {

最初の方法は次のようになります。

public JsonElement serialize(Collection<E> collection, Type type,
                             JsonSerializationContext context) {
    JsonArray result = new JsonArray();
    for(E item : collection){
        result.add(context.serialize(item));
    }
    return new JsonPrimitive(result.toString());
}

または、クラス宣言をそのままにして、メソッドを次のように変更できます。

public <E> JsonElement serialize(Collection<E> collection, Type type,
                             JsonSerializationContext context) {
    JsonArray result = new JsonArray();
    for(E item : collection){
        result.add(context.serialize(item));
    }
    return new JsonPrimitive(result.toString());
}

どちらが必要かは、ユースケースによって異なります (特定CollectionSerializerのコレクションが常に同じタイプのコレクションを期待するかどうか)。

于 2013-08-27T21:42:59.403 に答える