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