fixed issue 469 by adding a TypeAdapterFactory for throwables that ignores cause if it is self-referencing
This commit is contained in:
parent
1de2ace065
commit
b6a625fb6c
|
@ -23,6 +23,7 @@ import com.google.gson.internal.Streams;
|
|||
import com.google.gson.internal.bind.ArrayTypeAdapter;
|
||||
import com.google.gson.internal.bind.CollectionTypeAdapterFactory;
|
||||
import com.google.gson.internal.bind.DateTypeAdapter;
|
||||
import com.google.gson.internal.bind.ThrowableTypeAdapterFactory;
|
||||
import com.google.gson.internal.bind.JsonAdapterAnnotationTypeAdapterFactory;
|
||||
import com.google.gson.internal.bind.JsonTreeReader;
|
||||
import com.google.gson.internal.bind.JsonTreeWriter;
|
||||
|
@ -239,6 +240,7 @@ public final class Gson {
|
|||
factories.add(new MapTypeAdapterFactory(constructorConstructor, complexMapKeySerialization));
|
||||
factories.add(new JsonAdapterAnnotationTypeAdapterFactory(constructorConstructor));
|
||||
factories.add(TypeAdapters.ENUM_FACTORY);
|
||||
factories.add(new ThrowableTypeAdapterFactory(fieldNamingPolicy, excluder));
|
||||
factories.add(new ReflectiveTypeAdapterFactory(
|
||||
constructorConstructor, fieldNamingPolicy, excluder));
|
||||
|
||||
|
|
|
@ -56,10 +56,18 @@ public final class ReflectiveTypeAdapterFactory implements TypeAdapterFactory {
|
|||
}
|
||||
|
||||
public boolean excludeField(Field f, boolean serialize) {
|
||||
return excludeField(f, serialize, excluder);
|
||||
}
|
||||
|
||||
static boolean excludeField(Field f, boolean serialize, Excluder excluder) {
|
||||
return !excluder.excludeClass(f.getType(), serialize) && !excluder.excludeField(f, serialize);
|
||||
}
|
||||
|
||||
private String getFieldName(Field f) {
|
||||
return getFieldName(fieldNamingPolicy, f);
|
||||
}
|
||||
|
||||
static String getFieldName(FieldNamingStrategy fieldNamingPolicy, Field f) {
|
||||
SerializedName serializedName = f.getAnnotation(SerializedName.class);
|
||||
return serializedName == null ? fieldNamingPolicy.translateName(f) : serializedName.value();
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
package com.google.gson.internal.bind;
|
||||
|
||||
import com.google.gson.TypeAdapterFactory;
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
@ -44,6 +43,7 @@ import com.google.gson.JsonObject;
|
|||
import com.google.gson.JsonPrimitive;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import com.google.gson.TypeAdapter;
|
||||
import com.google.gson.TypeAdapterFactory;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import com.google.gson.internal.LazilyParsedNumber;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
@ -746,23 +746,19 @@ public final class TypeAdapters {
|
|||
}
|
||||
}
|
||||
|
||||
public static final TypeAdapterFactory ENUM_FACTORY = newEnumTypeHierarchyFactory();
|
||||
|
||||
public static TypeAdapterFactory newEnumTypeHierarchyFactory() {
|
||||
return new TypeAdapterFactory() {
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
|
||||
Class<? super T> rawType = typeToken.getRawType();
|
||||
if (!Enum.class.isAssignableFrom(rawType) || rawType == Enum.class) {
|
||||
return null;
|
||||
}
|
||||
if (!rawType.isEnum()) {
|
||||
rawType = rawType.getSuperclass(); // handle anonymous subclasses
|
||||
}
|
||||
return (TypeAdapter<T>) new EnumTypeAdapter(rawType);
|
||||
public static final TypeAdapterFactory ENUM_FACTORY = new TypeAdapterFactory() {
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
|
||||
Class<? super T> rawType = typeToken.getRawType();
|
||||
if (!Enum.class.isAssignableFrom(rawType) || rawType == Enum.class) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
if (!rawType.isEnum()) {
|
||||
rawType = rawType.getSuperclass(); // handle anonymous subclasses
|
||||
}
|
||||
return (TypeAdapter<T>) new EnumTypeAdapter(rawType);
|
||||
}
|
||||
};
|
||||
|
||||
public static <TT> TypeAdapterFactory newFactory(
|
||||
final TypeToken<TT> type, final TypeAdapter<TT> typeAdapter) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user